c语言 用链表 替换,如何用C语言创建一个链表,实现增、删、改、查

这段代码展示了C++如何实现顺序表的基本操作,包括初始化、销毁、置空、检查是否为空、获取长度、获取元素、查找元素、插入、删除、合并和追加元素。通过动态内存管理和指针操作来管理线性表的数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2017-09-06 回答

#include #include #include //函数结果状态码 #define true 1 #define false 0 #define ok 1 #define error 0 #define overflow -2 #define list_init_size 10 #define listincrement 4 //status是函数的类型,其值是函数结果的状态码 typedef int status; //定义数据类型 typedef int elemtype; //----------线性表的动态分配顺序存储结构------- typedef struct { elemtype *elem; int length; int listsize; }sqlist; //-----------基本操作-------------------------- status initlist_sq(sqlist *l); //初始化 void destroylist_sq(sqlist *l); //销毁 void clearlist_sq(sqlist *l); //置空 status listempty_sq(sqlist *l); //如果表l为空表返回true,否则为false status listlength_sq(sqlist *l); //返回l中数据元素个数 void getelem_sq(sqlist *l,int i,elemtype *e); //用e返回i位置的元素 status priorelem_sq(sqlist *l,int cur_e,elemtype *pre_e); //求前驱 status nextelem_sq(sqlist *l,int cur_e,elemtype *next_e); //求后继 status listinsert_sq(sqlist *l,int i,elemtype e); //插入 status listdelete_sq(sqlist *l,int i,elemtype *e); //删除 status listtransver_sq(sqlist *l); //依次对每个元素调用visit() status locateelem_sq(sqlist *l,elemtype e, status (*compare)(elemtype *,elemtype *));//进行俩个元素的比较 status mergelist(sqlist *la,sqlist *lb,sqlist *lc); //la,lb归并成lc status listappend_sq(sqlist *l,elemtype e); //-----------顺序表基本操作的实现-------------- status initlist_sq(sqlist *l) { l->elem = (elemtype *)malloc(list_init_size* sizeof(elemtype)); if(null==l->elem) return overflow; l->length = 0; l->listsize = list_init_size; return ok; }//initlist_sq status listinsert_sq(sqlist *l,int i,elemtype e) { if(i<1||i>l->length+1) return error; if(l->length>=l->listsize){ int *newbase; newbase = (elemtype *)realloc(l->elem, (l->listsize + listincrement)*sizeof(elemtype)); if(!newbase) exit(overflow); l->elem = newbase; l->listsize += listincrement; } int *q,*p; q =&(l->elem[i-1]); for(p=&(l->elem[l->length-1]);p>=q;--p) *(p+1) = *p; *q = e; ++l->length; return ok; }//listinsert_sq status listdelete_sq(sqlist *l,int i,elemtype *e) { if((i<1)||(i>l->length)) return error; int *p,*q; p=&(l->elem[i-1]); *e = *p; q=l->elem + l->length-1; for(++p;p<=q;++p) *(p-1)=*p; --l->length; return ok; }//listdelete_sq int locateelem_sq(sqlist *l,elemtype e, status(*compare)(elemtype *,elemtype *)) { int i=1; int *p=l->elem; while(i<=l->length&&(*compare)(p++,&e)) ++i; if(i<=l->length) return i; else return ok; }//locateelem_sq void mergelist_sq(sqlist *la,sqlist *lb,sqlist *lc) { initlist_sq(lc); elemtype ai,bj; int i=1,j=1,k=0; int la_len,lb_len; la_len=listlength_sq(la); lb_len=listlength_sq(lb); while((i<=la_len)&&(j<=lb_len)) { getelem_sq(la,i,&ai); getelem_sq(lb,j,&bj); if(ai<=bj) { listinsert_sq(lc,++k,ai); ++i; } else { listinsert_sq(lc,++k,bj); ++j; } } while(i<=la_len){ getelem_sq(la,i,&ai); listinsert_sq(lc,++k,ai); } while(j<=lb_len){ getelem_sq(lb,j,&bj); listinsert_sq(lc,++k,bj); } }//mergelist_sq int compare(elemtype *e1,elemtype *e2) { return (*e1-*e2); }//compare() void destroylist_sq(sqlist *l) { free(l->elem); l->elem=null; l->length=0; l->listsize=0; }//destroylist_sq() void clearlist_sq(sqlist *l) { memset(l->elem,0,l->listsize *sizeof(elemtype)); l->length=0; }//clearlist_sq status listempty_sq(sqlist *l) { if(l->length>0) return true; else return false; }//listempty_sq int listlength_sq(sqlist *l) { return l->length; }//listlength_sq void getelem_sq(sqlist *l,int i,elemtype *e) { if((i>=1)&&(i<=listlength_sq(l))) *e=l->elem[i-1]; }//getelem_sq status priorelem_sq(sqlist *l,elemtype cur_e,elemtype *pre_e) { int i; i=locateelem_sq(l,cur_e,compare); if(i>1) *pre_e=l->elem[i-2]; else return error; }//priorelem_sq status nextelem_sq(sqlist *l,elemtype cur_e,elemtype *next_e) { int i,n; i=locateelem_sq(l,cur_e,compare); n=listlength_sq(l); if((i>1)&&i<=n-1) *next_e=l->elem[i]; else return error; }//nextelem_sq status listtransver_sq(sqlist *l) { int i,n; n=listlength_sq(l); if(n==0) { printf("顺序表已经销毁或清空。\n"); return error; } else{ for(i=0;ielem[i]); printf("\n"); } return ok; }//listtransver_sq void printelem_sq(elemtype e) { printf("%d",e); }//printelem_sq status listappend_sq(sqlist *l,elemtype e) { if(l->length>=l->listsize) { elemtype *newbase =(elemtype *)realloc(l->elem,(l->length+listincrement) *sizeof(elemtype)); if(!newbase) return error; l->elem = newbase; l->listsize +=listincrement; } l->elem[l->length]=e; l->length++; return ok; }//listappend_sq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值