顺序表与链表.docx
- 文档编号:23094596
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:16
- 大小:17.20KB
顺序表与链表.docx
《顺序表与链表.docx》由会员分享,可在线阅读,更多相关《顺序表与链表.docx(16页珍藏版)》请在冰豆网上搜索。
顺序表与链表
.顺序表
#include
#include
#include"tag.h"
#defineLIST_INIT_SIZE100//首次分配的存储空间
#defineLISTINCREMENT10//增加的存储空间
typedefstruct{
int*elem;
intlength;//实际长度
intlistsize;//总长度
}SqList;
//顺序表的初始化
intinit_list(SqList&L)
{
L.elem=(int*)malloc(sizeof(int)*LIST_INIT_SIZE);//L.elem的类型为int*
if(!
L.elem)
exit(OVERFLOW);//存储分配失败
L.length=0;//空表长度为0
L.listsize=LIST_INIT_SIZE;//初始存储容量
returnOK;
}
//输入数据
intinput(SqList&L,intn)
{
inti;
//判断n的合法性
if(n<1||n>L.listsize)
exit(ERROR);
else
{
for(i=0;i { printf("请输入第%d个数据: \n",i+1); scanf("%d",&L.elem[i]); L.length++; } returnOK; } } //输出顺序表 voidprint(SqListL) { inti; printf("顺序表中的数据为: \n"); for(i=0;i { printf("%5d",L.elem[i]); } } //插入操作 intlist_insert(SqList&L,inti,inte) { int*newbase,*q,*p; //1.插入位置不合法i>=1&&i<=L.length+1 if(i<1||i>L.length+1)returnERROR; //2.存储空间不够 if(L.length==L.listsize){ //增加存储空间 newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int)); if(! newbase)exit(OVERFLOW);//不成功 //如果成功 L.elem=newbase; L.listsize+=LISTINCREMENT; } //3.正常插入 q=&L.elem[i-1];//第i个元素的地址 p=&L.elem[L.length-1];//最后一个元素的地址 for(p;p>=q;p--) { *(p+1)=*p; } *q=e; L.length++; returnOK; } //删除 intdelete_list(SqList&L,inti,int&e) { int*q,*p; //1.判断删除位置是否合法 if(i<1||i>L.length) returnERROR; //2.正常删除 q=&L.elem[i-1];//第i个元素的地址 e=*q; p=&L.elem[L.length-1];//最后一个元素的地址 for(q;q<=p;q++) { *q=*(q+1); } L.length--; returnOK; } //顺序表的合并 voidmerge_list(SqListLa,SqListLb,SqList&Lc) { int*pa,*pb,*pc; int*pa_last,*pb_last; pa=La.elem; pb=Lb.elem; Lc.listsize=Lc.length=La.length+Lb.length; Lc.elem=(int*)malloc(sizeof(int)*Lc.listsize); if(! Lc.elem)exit(OVERFLOW); //成功则合并 pc=Lc.elem; pa_last=La.elem+La.length-1; pb_last=Lb.elem+Lb.length-1; //两个表中都有元素时 while(pa<=pa_last&&pb<=pb_last){ if(*pa<=*pb) *pc++=*pa++; else*pc++=*pb++; } //当表La空时 while(pb<=pb_last){ *pc++=*pb++; } ////当表Lb空时 while(pa<=pa_last){ *pc++=*pa++; } } voidmain() { SqListS; inti=3;//插入位置 inte1=100;//插入元素 intn=5;//元素的个数 inte2;//带回删除的元素 intresult; intfan; intinput_result; init_list(S); input_result=input(S,n); if(input_result==0)printf("输入的n值非法! \n"); else print(S); result=list_insert(S,i,e1); if(result==1){ printf("插入成功! 插入后的表为: \n"); print(S); printf("\n"); } elseif(result==-2) printf("内存不足! \n"); elseprintf("输入的i值非法! \n"); fan=delete_list(S,i,e2); if(fan==0) printf("删除位置不合法! \n"); else { printf("删除的元素为: %5d\n",e2); //printf("删除后的顺序表为: \n"); print(S); } SqListLa,Lb,Lc; init_list(La); input(La,3); print(La); init_list(Lb); input(Lb,5); print(Lb); merge_list(La,Lb,Lc); print(Lc); } 单链表。 #include #include #defineTURE1 #defineFALSE0 #defineOK1 #defineERROR0 typedefstructLNode { intdata; structLNode*next; }LNode,*LinkList; intGetElem_L(LinkListL,inti,int&e)//取链表中的元素,e为返回值。 { LinkListp; intj; p=L->next; j=1; while(p&&j { p=p->next; ++j; } if(! p||j>i) returnERROR; else { e=p->data; returnOK; } } voidcreat(LinkList&L,intn)//创建链表 { inti; LinkListp; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=n;i>0;i--) { p=(LinkList)malloc(sizeof(LNode)); printf("输入第%d个节点: ",i); scanf("%d",&p->data); p->next=L->next; L->next=p; } } intListInsert(LinkList&L,inti,inte)//插入链表 { LinkListp,s; intj; p=L->next; j=1; while(p&&j { p=p->next; ++j; } if(! p||j>i) returnERROR; s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; returnOK; } intdelete_list(LinkList&L,inti,inte)//删除链表 { LinkListp,q; intj; p=L; j=0; while(p->next&&j { p=p->next; j++; } if(! p||j>i) returnERROR; q=p->next; e=p->data; p->next=q->next; free(q); returnOK; } voidprint(LinkListL)//输出链表 { LinkListp; p=L->next; while(p) { printf("%5d",p->data); p=p->next; } } voidmain() { inti=1; intn=5; inte1; inte2=100; inte3; LinkListH; creat(H,n); printf("创建链表: \n"); print(H); GetElem_L(H,i,e1); printf("取出第%d个数: ",i); printf("%5d",e1); ListInsert(H,i,e2); printf("插入第%d的位置%d\n",i,e2); print(H); delete_list(H,i,e3); printf("在第%d删除后: ",i); printf("删除元素为%d",e3); print(H); } 计算单链表中节点的个数。 #include #include typedefstructnode { intdata; structnode*next; }LNode; voidcount(LNode*L) { LNode*p; intn=0; p=L->next; while(p) { printf("%d",p->data); p=p->next; n++; } printf("\n%d",n); } voidmain() { inte; node*head,*p,*q; head=(LNode*)malloc(sizeof(LNode)); head->next=NULL; p=head; printf("输入元素,回车结束: "); do { scanf("%d",&e); q=(node*)malloc(sizeof(node)); q->data=e; q->next=NULL; p->next=q; p=q; }while(getchar()! ='\n'); count(head); } 26.删除单链表中值为x的元素。 #include #include #include"tag.h" typedefstructLNode { intdata; structLNode*next; }LNode,*Linklist; voidcreat(Linklist&L,intn)//输入n个元素的值 { inti; Linklistp; L=(Linklist)malloc(sizeof(LNode)); L->next=NULL; for(i=n;i>0;i--) { p=(Linklist)malloc(sizeof(LNode)); printf("输入第%d个节点: ",i); scanf("%d",&p->data); p->next=L->next; L->next=p; } } voidprint(LinklistL) { Linklistp; p=L->next; while(p) { printf("%2d",p->data); p=p->next; } printf("\n"); } voiddelete_list(Linklist&L,inte) { Linklistp,s; p=L->next; s=L; while(p) { if(p->data==e) { s->next=p->next; free(p); p=s->next; } else { s=p; p=p->next; } } } voidmain() { intn=5; inte1=3;//删除值为x的元素 LinklistH; creat(H,n); printf("创建的链表为: \n"); print(H); delete_list(H,e1); printf("删除值为%d的元素后: \n",e1); print(H); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 顺序
![提示](https://static.bdocx.com/images/bang_tan.gif)