顺序表
顺序表属于顺序存储结构,是最简单的顺序表,基本思想是用一段连续的储存单元依次存储线性表的数据元素,一般使用数组来定义,就能实现增,删,改,差等基本操作。
使用结构体来实现顺序表,结构体中有一个data数组,用来连续存储数据。变量last用来指明当前顺序表中有几个数据,方便访问顺序表。
typedef struct seqlist{
int data[MAX_LIST]; //数据域,MAX_LIST = 10
int last; //下标域
}my_seqlist, *p_my_seqlist;
初始化顺序表
当需要创建一个顺序表时,可以调用此函数,此函数给顺序表分配一个堆空间,并且将地址返回,接收此返回值用p_my_seqlist变量。
p_my_seqlist init_list(){
p_my_seqlist p_my_seqlist1 = calloc(1, sizeof(my_seqlist));
if(NULL == p_my_seqlist1)
return false;
return p_my_seqlist1;
}
插入数据
当需要在顺序表中插入数据的时候,调用此函数。注意需要传入已经初始化好的顺序表,第二个形参为需要插入的数据。
int insert_seqlist(p_my_seqlist p_my_seqlist1, int data){
if(NULL == p_my_seqlist1){
printf("LIST指针为空
");
return false;
}
if(MAX_LIST <= p_my_seqlist1->last){
printf("顺序表以满,无法建立顺序表
");
printf("p_my_seqlist1->last:%d
",p_my_seqlist1->last);
return false;
}
p_my_seqlist1->data[p_my_seqlist1->last++] = data; //每插入一个数据last需要加1,表示顺序表中的数据多了一个
return true;
}
打印顺序表
将顺序表中的数据打印出来。
int print_seqlist(p_my_seqlist p_my_seqlist1){
int i;
if(NULL == p_my_seqlist1){
printf("LIST指针为空
");
return false;
}
printf("p_my_seqlist1->last:%d
",p_my_seqlist1->last);
TRAVERSR(){ //#define TRAVERSR() for(int i = 0; i < p_my_seqlist1->last; i++) 因为这个循环会反复用到,所以使用了宏定义
printf("p_my_seqlist->data[%d]:%d
", i, p_my_seqlist1->data[i]);
}
printf("p_my_seqlist1->last:%d
",p_my_seqlist1->last);
return true;
}
查找顺序表
查找顺序表中的数据fdata,并且返回这个数据的下标。
int find_seqlist(p_my_seqlist p_my_seqlist1, int fdata){
if(NULL == p_my_seqlist1){
printf("LIST指针为空
");
return false;
}
printf("在顺序表中查找数据:%d
", fdata);
TRAVERSR(){
if(p_my_seqlist1->data[i] == fdata){
printf("在顺序表中查找到数据:%d
", p_my_seqlist1->data[i]);
return i;
}
}
printf("顺序表中没有这个数据:%d
", fdata);
return 0;
}
删除数据
可以调用此函数用来删除一个数据,参数2是删除下标del_num的值,可以配合函数find_seqlist()使用。
int del_seqlist(p_my_seqlist p_my_seqlist1, int del_num){
if(NULL == p_my_seqlist1){
printf("LIST指针为空
");
return false;
}
p_my_seqlist1->data[del_num] = p_my_seqlist1->data[del_num+1];
for(;del_num < p_my_seqlist1->last-1;del_num++){
p_my_seqlist1->data[del_num+1] = p_my_seqlist1->data[del_num+2];
}
p_my_seqlist1->last--;
printf("del_seqlist:p_my_seqlist1->last:%d
",p_my_seqlist1->last);
return true;
}
修改顺序表
将data[num]的数据修改为mdata,配合find_seqlist()使用,可以修改一个指定的值。
int mdata_seqlist(p_my_seqlist p_my_seqlist1, int num, int mdata){
if(NULL == p_my_seqlist1){
printf("LIST指针为空
");
return false;
}
p_my_seqlist1->data[num] = mdata;
printf("数据修改为了:p_my_seqlist1->data[num] = : %d
", p_my_seqlist1->data[num]);
return true;
}
销毁顺序表
将顺序表所占的内存释放
int destroy_seqlist(my_seqlist** p_my_seqlist1) //将&p_my_seqlist1传入
{
*p_my_seqlist1 = NULL;
free(*p_my_seqlist1);
printf("顺序表已被销毁了
");
return true;
}
测试函数
int test(){
p_my_seqlist p_my_seqlist1;
//初始化顺序表
p_my_seqlist1 = init_list();
int find_data;
if(NULL == p_my_seqlist1)
return false;
//插入10个数据
insert_seqlist(p_my_seqlist1, 0);
insert_seqlist(p_my_seqlist1, 1);
insert_seqlist(p_my_seqlist1, 2);
insert_seqlist(p_my_seqlist1, 3);
insert_seqlist(p_my_seqlist1, 4);
insert_seqlist(p_my_seqlist1, 5);
insert_seqlist(p_my_seqlist1, 6);
insert_seqlist(p_my_seqlist1, 7);
insert_seqlist(p_my_seqlist1, 8);
insert_seqlist(p_my_seqlist1, 9);
//打印数据
print_seqlist(p_my_seqlist1);
//查找数据,返回数据的下标
int num = find_seqlist(p_my_seqlist1,9);
//删除数据
del_seqlist(p_my_seqlist1, num);
print_seqlist(p_my_seqlist1);
//修改数据
num = find_seqlist(p_my_seqlist1,8);
mdata_seqlist(p_my_seqlist1,num,100);
print_seqlist(p_my_seqlist1);
//销毁表格
destroy_seqlist(&p_my_seqlist1);
printf("%p
", p_my_seqlist1);
insert_seqlist(p_my_seqlist1, 49);
print_seqlist(p_my_seqlist1);
del_seqlist(p_my_seqlist1, 2);
return 1;
}