文章目录
数据结构—P2线性顺序表
简介
线性表
概念
线性结构中的数据元素之间是一对一的关系,线性表(List)表示零个或多个数据元素的有限序列
若将线性表记为(data(1)…data(n)),则表中的data(i-1)领先于data(i),称data(i-1)是data(i)的前驱元素,data(i)是data(i-1)的后继元素
线性表元素的个数n(n>0)定义为线性表的长度,当n=0时,称为空表
描述
线性表L可用二元组形式描述
L=(D,R)
D表示数据元素的集合
D={ai|i=0,1,2,…n}
R表示关系集合
R={<ai,ai+1>|0<=i<=n-2}
特征
1.对非空表,表头无前驱
2.对非空表,表尾无后继
3.其他的每个元素都有一个直接前驱和一个直接后继
顺序表
概念
顺序存储结构是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和存储关系是一致的
即表中的各元素依次存储在一片连续的存储空间中
特征
优点:
1.逻辑上相连的元素其存储位置也是相邻的
2.对数据元素的存取为随机存取或按地址存取
3.存储密度高
缺点:
1.对表的插入和删除等运算的时间复杂度较差
实现
结构体创建
在开始线性顺序表的实现之前,先来构思一下表应该用什么方式来实现呢?
在此之前,先来构建整个文件的结构
创建之前
这里需要sqlist.c和sqlist.h作为表实现的主体,test.c作为测试程序和Makefile文件实现整体编译
然后进入到sqlist.h编写基本的结构
然后是sqlist.c
最后是test.c
创建结构体
在sqlist.h下创建线性顺序表结构体
#ifndef __SQLIST_H__
#define __SQLIST_H__
#include <stdio.h>
//定义int类型的数据的别名为data_t
typedef int data_t;
//定义线性顺序表结构体,并创建结构体和结构体指针别名为sqlist和*sqlink
#define N 1024//创建常量N,为表长度
typedef struct{
data_t data[N];//表数据组
int last;//表尾数据下标,表数据长度=last+1
}sqlist,*sqlink;
#endif
表的创建与销毁
创建完结构体之后,就需要创建表格和销毁表格的函数了
首先在sqlist.h下定义这两个函数
然后在sqlist.c中实现这两个函数
创建表函数
//创建表函数
sqlink sqlist_create(){
//创建表并申请内存空间
sqlink L;
L = (sqlink)malloc(sizeof(sqlist));
if(L == NULL){
printf("list malloc failed\n");
return L;
}
//初始化表
memset(L,0,sizeof(sqlist));
L->last = -1;
//返回表
return L;
}
释放表函数
//释放表函数
int sqlist_free(sqlink L){
//判断表是否创建
if(L == NULL){
return -1;
}
//释放表
free(L);
L = NULL;
return 0;
}
基础插入与状态属性
创建完表之后,接下来就需要在表中插入数据了
这里先来讲讲最简单的表尾插入
同样的在sqlist.h里进行定义
在sqlist.c里实现功能
//在表尾插入内容
int sqlist_downinsert(sqlink L,data_t value){
int i;//判断表是否为满
if(L->last == N-1){
printf("list is full\n");
return -1;
}
//将数据插入表尾
L->data[L->last+1] = value;
L->last++;
return 0;
}
好的表尾插入实现了,但是这里对于是否为满和长度的这些基本信息会在后面的其他函数中经常引用,这里给这些经常用的内容做一个封装
建立状态属性函数
在sqlist.h里定义函数
在sqlist.c里实现功能
判断表是否为空函数
//判断表是否为空(输入为表指针,输出为1时为空,为0时不空)
int sqlist_isempty(sqlink L){
if(L->last == -1){
return 1;
}else{
return 0;
}
}
判断表是否为满函数
//判断表是否为满(输入为表指针,输出为1时为满,为0时不满)
int sqlist_isfull(sqlink L){
if(L->last == N-1){
return 1;
}else{
return 0;
}
}
获取表长度函数
//表长度(输入为表指针,表为空时输出-1,表不为空时输出长度)
int sqlist_length(sqlink L){
if(sqlist_isempty(L)){
return -1;
}else{
return (L->last+1);
}
}
判断是否在范围内函数
//判断是否在范围内(输入为表指针,表不在范围内输出1,在范围内输出为0)
int sqlist_inlist(sqlink L,int pos){
if(pos < 0 || pos > L->last+1){
return 1;
}else{
return 0;
}
}
然后就可以对之前的表尾插入函数做出一定的修改
//在表尾插入内容
int sqlist_downinsert(sqlink L,data_t value){
int i;//判断表是否为满
if(sqlist_isfull(L)){
printf("list is full\n");
return -1;
}
//数据插入表尾
if(sqlist_isempty(L)){
L->data[0] = value;
}else{
L->data[sqlist_length(L)] = value;
}
L->last++;
return 0;
}
测试程序与Makefile
做完这些,需要先来测试一下程序的可行性
编写测试程序test.c
#include <stdio.h>
#include "sqlist.h"
int main(int argc, const char *argv[])
{
//创建表
sqlink L;
L =sqlist_create();
//插入内容
sqlist_downinsert(L,2);
//释放表
sqlist_free(L);
return 0;
}
然后呢,编写Makefile
test:test.o sqlist.o
gcc -o test test.o sqlist.o
test.o:test.c sqlist.h
gcc -c test.c
sqlist.o:sqlist.c sqlist.h
gcc -c sqlist.c
.PHONY:clean
clean:
rm *.o
好的,万事具备,只差测试了
好的编译成功了,但是没有任何效果,所以接下来就要将如何把表的内容显示出来
但是在讲这个之前先来个知识点
使用vs指令,可以在vim里进行多窗口编辑
内容显示与更多插入
内容显示
//显示表所有内容
int sqlist_show(sqlink L){
int i;
//判断表是否被创建
if(L == NULL){
return -1;
}
printf("sqlist:\n");
//判断表是否为空
if(sqlist_isempty(L)){
printf("list is empty\n");
}
//打印表数据
for(i = 0;i < sqlist_length(L);i++){
printf("%d ",L->data[i]);
}
printf("\n");
return 0;
}
好的写好了显示内容的函数,就先来测测效果吧
当然在此之前先修改一下test.c
#include <stdio.h>
#include "sqlist.h"
int main(int argc, const char *argv[])
{
//创建表
sqlink L;
L =sqlist_create();
//插入内容
sqlist_downinsert(L,3);
sqlist_downinsert(L,1);
sqlist_downinsert(L,0);
//显示内容
sqlist_show(L);
//释放表
sqlist_free(L);
return 0;
}
测试程序
我们看到了显示的效果
除了在表尾插入内容外,是不是还可以在表头插入内容呢?
或者指定一个位置插入内容,如果想一次插入多个内容又该怎么办呢?
接下将会一一实现这些功能
表头插入
编写sqlist.h
编写sqlist.c
//在表头插入数据函数
int sqlist_topinsert(sqlink L,data_t value){
int i;
//判断表是否为满
if(sqlist_isfull(L)){
printf("list is full\n");
return -1;
}
//将表数据后移
for(i = L->last;i >= 0;i--){
L->data[i+1] = L->data[i];
}
//将数据插入表头
L->data[0] = value;
L->last++;
return 0;
}
优化测试程序
编写test.c
#include <stdio.h>
#include "sqlist.h"
int insert_test(){
//创建表
sqlink L;
L =sqlist_create();
//表尾插入内容
sqlist_downinsert(L,3);
sqlist_downinsert(L,1);
sqlist_downinsert(L,0);
//显示内容
sqlist_show(L);
//表头插入内容
sqlist_topinsert(L,5);
sqlist_topinsert(L,7);
//显示内容
sqlist_show(L);
//释放表
sqlist_free(L);
}
int main(int argc, const char *argv[])
{
insert_test();
return 0;
}
测试程序
指定位置插入
编写sqlist.h
编写sqlist.c
//指定位置插入数据函数
int sqlist_insert(sqlink L,data_t value,int pos){
int i;
//判断表是否为满
if(sqlist_isfull(L)){
printf("list is full\n");
return -1;
}
if(sqlist_inlist(L,pos)){
printf("pos is invalid\n");
return -1;
}
//将表数据后移
for(i = L->last;i >= pos;i--){
L->data[i+1] = L->data[i];
}
//将数据插入指定位置
L->data[pos] = value;
L->last++;
return 0;
}
编写test.c
int insert_test(){
//创建表
sqlink L;
L =sqlist_create();
//表尾插入内容
sqlist_downinsert(L,3);
sqlist_downinsert(L,1);
sqlist_downinsert(L,0);
//显示内容
sqlist_show(L);
//表头插入内容
sqlist_topinsert(L,5);
sqlist_topinsert(L,7);
//显示内容
sqlist_show(L);
//在指定位置插入内容
sqlist_insert(L,6,1);
sqlist_insert(L,4,3);
//显示内容
sqlist_show(L);
//释放表
sqlist_free(L);
}
测试程序
指定位置插入一组数据
这里做一个小小的扩展,指定位置插入一组数据,方便后的讲解
编写sqlist.h
编写sqlist.c
//在指定位置插入一组数据
int sqlist_arrayinsert(sqlink L,data_t *array,int n,int pos){
int i;
for(i = 0;i < n;i++){
sqlist_insert(L,array[i],pos+i);
}
}
编写test.c
int insert_test(){
//创建表
sqlink L;
L =sqlist_create();
//表尾插入内容
sqlist_downinsert(L,3);
sqlist_downinsert(L,1);
sqlist_downinsert(L,0);
//显示内容
sqlist_show(L);
//表头插入内容
sqlist_topinsert(L,5);
sqlist_topinsert(L,7);
//显示内容
sqlist_show(L);
//在指定位置插入内容
sqlist_insert(L,6,1);
sqlist_insert(L,4,3);
//显示内容
sqlist_show(L);
//在指定位置插入一组数据
int a[]={8,9,10,11,12};
int n = sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,6);
sqlist_show(L);
//显示内容
sqlist_show(L);
//释放表
sqlist_free(L);
}
测试程序
优化
删除相关
好的,线性顺序表已经初具成形了,接下来如果需要删除不要的内容,就需要用到删除操作
清空表
编写sqlist.h
编写sqlist.c
//清空表
int sqlist_clear(sqlink L){
if(L == NULL){
return -1;
}
memset(L,0,sizeof(sqlist));
L->last = -1;
return 0;
}
编写test.c
//删除测试程序
int delete_test(){
//创建表
sqlink L;
L =sqlist_create();
//在指定位置插入一组数据
int a[]={8,9,10,11,12};
int n = sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,0);
//显示内容
sqlist_show(L);
sqlist_clear(L);
//显示内容
sqlist_show(L);
//释放表
sqlist_free(L);
}
int main(int argc, const char *argv[])
{
int chn,n = 1;
while(n){
printf("选择测试程序\n");
printf("0.退出1.插入操作2.删除操作:");
scanf("%d",&chn);
switch(chn){
case 0:n = 0;break;
case 1:insert_test();break;
case 2:delete_test();break;
default:printf("不在输入范围内请重新输入!\n");
}
}
return 0;
}
测试程序
删除指定位置的内容
编写sqlist.h
编写sqlist.c
//删除指定位置的内容
int sqlist_posdelete(sqlink L,int pos){
int i;
if(sqlist_isempty(L)){
printf("list is empty\n");
return -1;
}
if(sqlist_inlist(L,pos)){
printf("delete pos is invalid\n");
return -1;
}
for(i = pos+1; i < sqlist_length(L);i++){
L->data[i-1] = L->data[i];
}
L->last--;
return 0;
}
编写test.c
//删除测试程序
int delete_test(int c){
//创建表
sqlink L;
L =sqlist_create();
//在指定位置插入一组数据
int a[]={8,9,10,11,12};
int n = sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,0);
//显示内容
sqlist_show(L);
if(c == 1){
sqlist_clear(L);
}else if(c == 2){
sqlist_posdelete(L,2);
}else if(c == 3){
}
//显示内容
sqlist_show(L);
//释放表
sqlist_free(L);
}
int main(int argc, const char *argv[])
{
int chn,c1,n = 1;
while(n){
printf("选择测试程序\n");
printf("0.退出1.插入操作2.删除操作:");
scanf("%d",&chn);
switch(chn){
case 0:n = 0;break;
case 1:insert_test();break;
case 2:
printf("选择类型(0.返回1.清空表2.定位删除3.内容删除):");
scanf("%d",&c1);
switch(c1){
case 0:break;
case 1:delete_test(1);break;
case 2:delete_test(2);break;
case 3:delete_test(3);break;
}
break;
default:printf("不在输入范围内请重新输入!\n");
}
}
return 0;
}
测试程序
删除指定内容
编写sqlist.h
编写sqlist.c
//删除指定内容
int sqlist_valuedelete(sqlink L,data_t value){
int pos,i;
for(i = 0;i <= L->last;i++){
if(L->data[i] == value){
pos = i;
}
}
sqlist_posdelete(L,pos);
return 0;
}
编写test.c
测试程序
查找相关
指定位置查找内容
编写sqlist.h
编写sqlist.c
//查找指定位置的内容
data_t sqlist_poslocate(sqlink L,int pos){
//判断表是否为满
if(sqlist_isfull(L)){
printf("list is full\n");
return -1;
}
if(sqlist_inlist(L,pos)){
printf("pos is invalid\n");
return -1;
}
return (L->data[pos]);
}
编写test.c
int locate_test(){
//创建表
sqlink L;
L =sqlist_create();
//在指定位置插入一组数据
int a[]={8,9,10,11,12};
int n = sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,0);
//显示内容
sqlist_show(L);
printf("%d\n",sqlist_poslocate(L,2));
//释放表
sqlist_free(L);
}
测试程序
指定内容查找位置
编写sqlist.h
编写sqlist.c
//查找指定内容的位置
int sqlist_valuelocate(sqlink L,data_t value){
int i;
for(i = 0;i <= L->last;i++){
if(L->data[i] == value){
return i;
}
}
return -1;
}
编写test.c
测试程序
修改相关
修改指定位置内容
编写sqlist.h
编写sqlist.c
//修改指定位置内容
int sqlist_posmodify(sqlink L,int pos,data_t value){
//判断表是否为满
if(sqlist_isfull(L)){
printf("list is full\n");
return -1;
}
if(sqlist_inlist(L,pos)){
printf("pos is invalid\n");
return -1;
}
L->data[pos] = value;
return 0;
}
编写test.c
int modify_test(){
//创建表
sqlink L;
L =sqlist_create();
//在指定位置插入一组数据
int a[]={8,9,10,11,12};
int n = sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,0);
//显示内容
sqlist_show(L);
sqlist_posmodify(L,2,20);
//显示内容
sqlist_show(L);
//释放表
sqlist_free(L);
}
测试程序
修改指定内容的指定内容
编写sqlist.h
编写sqlist.c
//修改指定内容为指定内容
int sqlist_valuemodify(sqlink L,data_t rvalue,data_t value){
int pos;
pos = sqlist_valuelocate(L,rvalue);
sqlist_posmodify(L,pos,value);
}
编写test.c
测试程序
整体优化
插入优化
对于插入其实在表尾和表头插入都是指定位置插入的特殊情况,因此可以简化代码量
编写sqlist.c
/*-----------------------------------插入操作--------------------------------*/
//在表尾插入内容
int sqlist_downinsert(sqlink L,data_t value){
sqlist_insert(L,value,L->last+1);
}
//在表头插入数据函数
int sqlist_topinsert(sqlink L,data_t value){
sqlist_insert(L,value,0);
}
//指定位置插入数据函数
int sqlist_insert(sqlink L,data_t value,int pos){
int i;
//判断表是否为满
if(sqlist_isfull(L)){
printf("list is full\n");
return -1;
}
if(sqlist_inlist(L,pos)){
printf("pos is invalid\n");
return -1;
}
//将表数据后移
for(i = L->last;i >= pos;i--){
L->data[i+1] = L->data[i];
}
//将数据插入指定位置
L->data[pos] = value;
L->last++;
return 0;
}
//在指定位置插入一组数据
int sqlist_arrayinsert(sqlink L,data_t *array,int n,int pos){
int i;
for(i = 0;i < n;i++){
sqlist_insert(L,array[i],pos+i);
}
}
测试程序
删除优化
编写sqlist.c
测试程序
扩展
表合并
编写sqlist.h
编写sqlist.c
//表合并
int sqlist_merge(sqlink L1,sqlink L2){
int i = 0;
int ret;
while(i <= L2->last){
ret = sqlist_valuelocate(L1,L2->data[i]);
if(ret == -1){
if(sqlist_downinsert(L1,L2->data[i]) == -1){
return -1;
}
}
i++;
}
return 0;
}
编写test.c
int merge_test(){
//创建表
sqlink La,Lb;
La = sqlist_create();
Lb = sqlist_create();
int a[]={11,12,13,14,15};
int b[]={11,16,12,17,14,18};
int n1 = sizeof(a)/sizeof(int);
int n2 = sizeof(b)/sizeof(int);
sqlist_arrayinsert(La,a,n1,0);
sqlist_arrayinsert(Lb,b,n2,0);
sqlist_show(La);
sqlist_show(Lb);
sqlist_merge(La,Lb);
sqlist_show(La);
sqlist_show(Lb);
sqlist_free(La);
sqlist_free(Lb);
}
测试程序
表去重
编写sqlist.h
编写sqlist.c
//表去重
int sqlist_purge(sqlink L){
int i,j;
if(L->last == 0){
return 0;
}
i = 1;
while(i <= L->last){
j = i-1;
while(j >= 0){
if(L->data[i] == L->data[j]){
sqlist_posdelete(L,i);
break;
}else{
j--;
}
}
if(j < 0){
i++;
}
}
return 0;
}
编写test.c
int purge_test(){
//创建表
sqlink L;
L = sqlist_create();
int a[]={11,12,13,15,14,15,16,12,11};
int n =sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,0);
sqlist_show(L);
sqlist_purge(L);
sqlist_show(L);
sqlist_free(L);
}
测试程序
整体代码
实现的功能总结
sqlist.h
#ifndef __SQLIST_H__
#define __SQLIST_H__
#include <stdio.h>
//定义int类型的数据的别名为data_t
typedef int data_t;
//定义线性顺序表结构体,并创建结构体和结构体指针别名为sqlist和*sqlink
#define N 1024//创建常量N,为表长度
typedef struct{
data_t data[N];//表数据组
int last;//表尾数据下标,表数据长度=last+1
}sqlist,*sqlink;
//创建与删除
sqlink sqlist_create();//创建表
int sqlist_free(sqlink L);//释放表
int sqlist_clear(sqlink L);//清空表
int sqlist_posdelete(sqlink L,int pos);//删除指定位置的内容
int sqlist_valuedelete(sqlink L,data_t value);//删除指定内容
//状态属性
int sqlist_isempty(sqlink L);//判断表是否为空
int sqlist_isfull(sqlink L);//判断表是否为满
int sqlist_length(sqlink L);//表长度
int sqlist_inlist(sqlink L,int pos);//判断是否在范围内
//查找操作
int sqlist_show(sqlink L);//显示表所有内容
data_t sqlist_poslocate(sqlink L,int pos);//查找指定位置的内容
int sqlist_valuelocate(sqlink L,data_t value);//查找指定内容的位置
//插入操作
int sqlist_downinsert(sqlink L,data_t value);//在表尾插入内
int sqlist_topinsert(sqlink L,data_t value);//在表头插入内容
int sqlist_insert(sqlink L,data_t value,int pos);//在指定位置插入内容
int sqlist_arrayinsert(sqlink L,data_t *array,int n,int pos);//在指定位置插入一组数据
//修改操作
int sqlist_posmodify(sqlink L,int pos,data_t value);//修改指定位置的内容
int sqlist_valuemodify(sqlink L,data_t rvalue,data_t value);//修改指定内容都为指定内容
//扩展操作
int sqlist_merge(sqlink L1,sqlink L2);//合并表
int sqlist_purge(sqlink L);//表去重
#endif
sqlist.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlist.h"
/*-----------------------------------创建与删除--------------------------------*/
//创建表函数
sqlink sqlist_create(){
//创建表并申请内存空间
sqlink L;
L = (sqlink)malloc(sizeof(sqlist));
if(L == NULL){
printf("list malloc failed\n");
return L;
}
//初始化表
memset(L,0,sizeof(sqlist));
L->last = -1;
//返回表
return L;
}
//释放表函数
int sqlist_free(sqlink L){
//判断表是否创建
if(L == NULL){
return -1;
}
//释放表
free(L);
L = NULL;
return 0;
}
//清空表
int sqlist_clear(sqlink L){
if(L == NULL){
return -1;
}
memset(L,0,sizeof(sqlist));
L->last = -1;
return 0;
}
//删除指定位置的内容
int sqlist_posdelete(sqlink L,int pos){
int i;
if(sqlist_isempty(L)){
printf("list is empty\n");
return -1;
}
if(sqlist_inlist(L,pos)){
printf("delete pos is invalid\n");
return -1;
}
for(i = pos+1; i < sqlist_length(L);i++){
L->data[i-1] = L->data[i];
}
L->last--;
return 0;
}
//删除指定内容
int sqlist_valuedelete(sqlink L,data_t value){
int pos;
pos = sqlist_valuelocate(L,value);
sqlist_posdelete(L,pos);
return 0;
}
/*-----------------------------------状态属性--------------------------------*/
//判断表是否为空(输入为表指针,输出为1时为空,为0时不空)
int sqlist_isempty(sqlink L){
if(L->last == -1){
return 1;
}else{
return 0;
}
}
//判断表是否为满(输入为表指针,输出为1时为满,为0时不满)
int sqlist_isfull(sqlink L){
if(L->last == N-1){
return 1;
}else{
return 0;
}
}
//表长度(输入为表指针,表为空时输出-1,表不为空时输出长度)
int sqlist_length(sqlink L){
if(sqlist_isempty(L)){
return -1;
}else{
return (L->last+1);
}
}
//判断是否在范围内(输入为表指针,表不在范围内输出1,在范围内输出为0)
int sqlist_inlist(sqlink L,int pos){
if(pos < 0 || pos > L->last+1){
return 1;
}else{
return 0;
}
}
/*-----------------------------------查找操作--------------------------------*/
//显示表所有内容
int sqlist_show(sqlink L){
int i;
//判断表是否被创建
if(L == NULL){
return -1;
}
printf("sqlist:\n");
//判断表是否为空
if(sqlist_isempty(L)){
printf("list is empty\n");
}
//打印表数据
for(i = 0;i < sqlist_length(L);i++){
printf("%d ",L->data[i]);
}
printf("\n");
return 0;
}
//查找指定位置的内容
data_t sqlist_poslocate(sqlink L,int pos){
//判断表是否为满
if(sqlist_isfull(L)){
printf("list is full\n");
return -1;
}
if(sqlist_inlist(L,pos)){
printf("pos is invalid\n");
return -1;
}
return (L->data[pos]);
}
//查找指定内容的位置
int sqlist_valuelocate(sqlink L,data_t value){
int i;
for(i = 0;i <= L->last;i++){
if(L->data[i] == value){
return i;
}
}
return -1;
}
/*-----------------------------------插入操作--------------------------------*/
//在表尾插入内容
int sqlist_downinsert(sqlink L,data_t value){
sqlist_insert(L,value,L->last+1);
}
//在表头插入数据函数
int sqlist_topinsert(sqlink L,data_t value){
sqlist_insert(L,value,0);
}
//指定位置插入数据函数
int sqlist_insert(sqlink L,data_t value,int pos){
int i;
//判断表是否为满
if(sqlist_isfull(L)){
printf("list is full\n");
return -1;
}
if(sqlist_inlist(L,pos)){
printf("pos is invalid\n");
return -1;
}
//将表数据后移
for(i = L->last;i >= pos;i--){
L->data[i+1] = L->data[i];
}
//将数据插入指定位置
L->data[pos] = value;
L->last++;
return 0;
}
//在指定位置插入一组数据
int sqlist_arrayinsert(sqlink L,data_t *array,int n,int pos){
int i;
for(i = 0;i < n;i++){
sqlist_insert(L,array[i],pos+i);
}
}
/*-----------------------------------修改操作--------------------------------*/
//修改指定位置内容
int sqlist_posmodify(sqlink L,int pos,data_t value){
//判断表是否为满
if(sqlist_isfull(L)){
printf("list is full\n");
return -1;
}
if(sqlist_inlist(L,pos)){
printf("pos is invalid\n");
return -1;
}
L->data[pos] = value;
return 0;
}
//修改指定内容为指定内容
int sqlist_valuemodify(sqlink L,data_t rvalue,data_t value){
int pos;
pos = sqlist_valuelocate(L,rvalue);
sqlist_posmodify(L,pos,value);
}
/*-----------------------------------扩展操作--------------------------------*/
//表合并
int sqlist_merge(sqlink L1,sqlink L2){
int i = 0;
int ret;
while(i <= L2->last){
ret = sqlist_valuelocate(L1,L2->data[i]);
if(ret == -1){
if(sqlist_downinsert(L1,L2->data[i]) == -1){
return -1;
}
}
i++;
}
return 0;
}
//表去重
int sqlist_purge(sqlink L){
int i,j;
if(L->last == 0){
return 0;
}
i = 1;
while(i <= L->last){
j = i-1;
while(j >= 0){
if(L->data[i] == L->data[j]){
sqlist_posdelete(L,i);
break;
}else{
j--;
}
}
if(j < 0){
i++;
}
}
return 0;
}
test.c
#include <stdio.h>
#include "sqlist.h"
//插入测试程序
int insert_test(){
//创建表
sqlink L;
L =sqlist_create();
//表尾插入内容
sqlist_downinsert(L,3);
sqlist_downinsert(L,1);
sqlist_downinsert(L,0);
//显示内容
sqlist_show(L);
//表头插入内容
sqlist_topinsert(L,5);
sqlist_topinsert(L,7);
//显示内容
sqlist_show(L);
//在指定位置插入内容
sqlist_insert(L,6,1);
sqlist_insert(L,4,3);
//显示内容
sqlist_show(L);
//在指定位置插入一组数据
int a[]={8,9,10,11,12};
int n = sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,6);
//显示内容
sqlist_show(L);
//释放表
sqlist_free(L);
}
//删除测试程序
int delete_test(int c){
//创建表
sqlink L;
L =sqlist_create();
//在指定位置插入一组数据
int a[]={8,9,10,11,12};
int n = sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,0);
//显示内容
sqlist_show(L);
if(c == 1){
sqlist_clear(L);
}else if(c == 2){
sqlist_posdelete(L,2);
}else if(c == 3){
sqlist_valuedelete(L,11);
}
//显示内容
sqlist_show(L);
//释放表
sqlist_free(L);
}
int locate_test(){
//创建表
sqlink L;
L =sqlist_create();
//在指定位置插入一组数据
int a[]={8,9,10,11,12};
int n = sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,0);
//显示内容
sqlist_show(L);
printf("%d\n",sqlist_poslocate(L,2));
printf("%d\n",sqlist_valuelocate(L,12));
//释放表
sqlist_free(L);
}
int modify_test(){
//创建表
sqlink L;
L =sqlist_create();
//在指定位置插入一组数据
int a[]={8,9,10,11,12};
int n = sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,0);
//显示内容
sqlist_show(L);
sqlist_posmodify(L,2,20);
//显示内容
sqlist_show(L);
sqlist_valuemodify(L,11,21);
//显示内容
sqlist_show(L);
//释放表
sqlist_free(L);
}
int merge_test(){
//创建表
sqlink La,Lb;
La = sqlist_create();
Lb = sqlist_create();
int a[]={11,12,13,14,15};
int b[]={11,16,12,17,14,18};
int n1 = sizeof(a)/sizeof(int);
int n2 = sizeof(b)/sizeof(int);
sqlist_arrayinsert(La,a,n1,0);
sqlist_arrayinsert(Lb,b,n2,0);
sqlist_show(La);
sqlist_show(Lb);
sqlist_merge(La,Lb);
sqlist_show(La);
sqlist_show(Lb);
sqlist_free(La);
sqlist_free(Lb);
}
int purge_test(){
//创建表
sqlink L;
L = sqlist_create();
int a[]={11,12,13,15,14,15,16,12,11};
int n =sizeof(a)/sizeof(int);
sqlist_arrayinsert(L,a,n,0);
sqlist_show(L);
sqlist_purge(L);
sqlist_show(L);
sqlist_free(L);
}
int main(int argc, const char *argv[])
{
int chn,c1,n = 1;
while(n){
printf("选择测试程序\n");
printf("0.退出1.插入操作2.删除操作3.查找操作4.修改操作5.表合并6.表去重:");
scanf("%d",&chn);
switch(chn){
case 0:n = 0;break;
case 1:insert_test();break;
case 2:
printf("选择类型(0.返回1.清空表2.定位删除3.内容删除):");
scanf("%d",&c1);
switch(c1){
case 0:break;
case 1:delete_test(1);break;
case 2:delete_test(2);break;
case 3:delete_test(3);break;
}
break;
case 3:locate_test();break;
case 4:modify_test();break;
case 5:merge_test();break;
case 6:purge_test();break;
default:printf("不在输入范围内请重新输入!\n");
}
}
return 0;
}
Makefile
test:test.o sqlist.o
gcc -o test test.o sqlist.o
test.o:test.c sqlist.h
gcc -c test.c
sqlist.o:sqlist.c sqlist.h
gcc -c sqlist.c
.PHONY:clean
clean:
rm *.o