线性表.docx
- 文档编号:27067632
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:32
- 大小:223.05KB
线性表.docx
《线性表.docx》由会员分享,可在线阅读,更多相关《线性表.docx(32页珍藏版)》请在冰豆网上搜索。
线性表
#include
#include
#include
#defineLIST_INIT_SIZE100
#defineLISTNCREMENT10
typedefstruct
{
int*elem;
intlength;
intlistsize;
}Sqlist;
SqlistInitSList();
voidInsertSList(SqlistL,inti,inte);
voidDeleteSList(SqlistL,inti);
voidFindList(SqlistL,inti);
voidSearchList(SqlistL,inti,intkey);
voidNiZhiList(SqlistL);
voidMergeList(SqlistLa,SqlistLb,Sqlist&Lc);
/***************************主函数**********************/
voidmain()
{
inti,m,e;
SqlistL;
L=InitSList();
printf("请输入表长:
\n");
scanf("%d",&L.length);
printf("表中的元素是:
\n");
for(i=0;i scanf("%d",&L.elem[i]); printf("请选择: \n"); printf("1: 插入元素: \n"); printf("2: 删除元素: \n"); printf("3: 按位置查找元素: \n"); printf("4: 顺序表逆置: \n"); printf("5: 顺序表合并: \n"); printf("6: 按值查找元素: \n"); scanf("%d",&m); switch(m) { case1: printf("请输入插入元素的位置i: \n"); scanf("%d",&i); printf("请输入插入的新元素e: \n"); scanf("%d",&e); InsertSList(L,i,e); printf("新的顺序表中的元素是: \n"); for(i=0;i printf("%d",L.elem[i]); break; case2: printf("请输入删除元素的位置: \n"); scanf("%d",&i); DeleteSList(L,i); printf("新的顺序表中的元素是: \n"); for(i=0;i printf("%d",L.elem[i]); break; case3: printf("请输入查找元素的位置: \n"); scanf("%d",&i); FindList(L,i); break; case4: NiZhiList(L); break; case5: SqlistL1; L1=InitSList(); printf("初始化L1: \n"); printf("请输入表长: \n"); scanf("%d",&L1.length); printf("表中的元素是: "); for(i=0;i scanf("%d",&L.elem[i]); printf("\nL1输出元素: \n"); for(i=0;i { printf("%d",L1.elem[i]); }// SqlistL2; L2=InitSList(); MergeList(L,L1,L2); printf("L2输出元素: \n"); for(i=0;i { printf("%d",L2.elem[i]); } break; case6: printf("请输入需要查找的元素值: \n"); scanf("%d",&e); SearchList(L,i,e); break; default: printf("ERROR"); } } /********************创建顺序表**********************/ SqlistInitSList() { SqlistL; L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); if(! L.elem)exit(0); L.length=0; L.listsize=LIST_INIT_SIZE; returnL; } /*************************删除元素************************/ voidDeleteSList(SqlistL,inti) { int*p,*q; if((i<1)||(i>L.length)) printf("ERROR"); p=&(L.elem[i-1]); q=L.elem+L.length-1; for(++p;p<=q;++p) *(p-1)=*p; --L.length; } /*************************插入元素**********************/ voidInsertSList(SqlistL,inti,inte) { int*newbase; int*q,*p; if(i<1||i>L.length+1) printf("error"); if(L.length>=L.listsize) { newbase=(int*)realloc(L.elem,(L.listsize+LISTNCREMENT)*sizeof(int)); if(! newbase)exit(0); L.elem=newbase; L.listsize+=LISTNCREMENT; } q=&(L.elem[i-1]); for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p; *q=e; ++L.length; } /********************按位置查找元素**************************/ voidFindList(SqlistL,inti) { int*p,e; printf("请输入查找元素的位置: \n"); scanf("%d",&i); p=&(L.elem[i-1]); e=*p; printf("请输出该位置的元素: \n"); printf("%d",e); } /************************按值查找元素*********************/ voidSearchList(SqlistL,inti,intkey) { for(i=1;i { if(L.elem[i-1]==key) printf("该元素的位置是: \n%d",i); } } /************************顺序表逆置***********************/ voidNiZhiList(SqlistL) { int*s,i; for(i=0;i { s=&L.elem[i]; L.elem[i]=L.elem[L.length-i-1]; L.elem[L.length-i-1]=*s; } printf("新的顺序表中的元素是: \n"); for(i=0;i printf("%d",L.elem[i]); } /************************顺序表合并************************/ voidMergeList(SqlistLa,SqlistLb,Sqlist&Lc) { int*pc,*pa,*pb,*palast,*pblast; intppc,ppa,ppb,ppalast,ppblast; pa=La.elem; pb=Lb.elem; ppa=0; ppb=0; ppalast=La.length-1; ppblast=Lb.length-1; Lc.listsize=Lc.length=La.length+Lb.length; pc=Lc.elem=(int*)malloc(Lc.listsize*sizeof(Lc.listsize*sizeof(int))); if(! Lc.elem) exit(0); palast=La.elem+La.length-1; pblast=Lb.elem+Lb.length-1; while(pa<=palast&&pb<=pblast) {//归并 //printf("%d%d",La.elem[pa],Lb.elem[pb]); if(*pa<=*pb) *pc++=*pa++; else *pc++=*pb++; } while(*pa<=*palast) *pc++=*pa++; while(*pb<=*pblast) *pc++=*pb++; } #include #include //定义一个结构体链表,里面分为数据域和指针域 typedefstructt { intdata; structt*Next; }Node,*pNode; pNodecreat_list(); voidg(pNode);//遍历整个链表 boolis_empty(pNode);//判断链表是否为空 intlength(pNode);//计算链表的长度 boolsort(pNode);//对链表进行排序 boolinsert(pNode);//对链表插入一个新的结点 booldelete_list(pNode,int*);//对链表删除一个已有的结点 boolseek(pNode,int&);//对链表进行元素的查找 boolMerge(pNode*pHead1,pNode*pHead2);//链表的合并 /*********************主函数******************/ voidmain() { intval; intn=1; pNodepHead; pHead=creat_list();//创造出一个动态链表,并进行封装交还给pHead g(pHead); if(sort(pHead)) { printf("经过排列后的链表为: \n"); g(pHead); } elseprintf("链表为空,无法排序! \n"); if(insert(pHead)) { printf("插入成功! \n新链表为: \n"); g(pHead); } else printf("插入失败! \n"); if(delete_list(pHead,&val)) { printf("删除成功! \n删除的元素是: %d\n",val); printf("删除后的链表为: \n"); g(pHead); } else printf("删除失败! \n"); if(seek(pHead,n)) { printf("查找成功,元素在第%d个结点上\n",n); } else printf("所查找的元素不存在! \n"); pNodepHead2; pHead2=creat_list(); if(Merge(pHead,pHead2)) { printf("合并后的链表为: "); } } /**********************创建链表******************/ pNodecreat_list() { inti=1,val; pNodepHead=(pNode)malloc(sizeof(Node)); if(pHead==NULL) { printf("分配失败! \n"); exit(-1); } pNodet; t=pHead; t->Next=NULL; printf("请直接输入元素的值,直到输入“-32767”为止! \n");//这样的好处在于可以根据用户的需求控制链表的长度 printf("请输入第%2d个元素的值: ",i++); scanf("%d",&val); while(val! =-32767) { pNodeNew=(pNode)malloc(sizeof(Node));//动态分布内存,可以随时释放,防止内存泄漏 New->data=val; t->Next=New; New->Next=NULL; t=New; printf("请输入第%2d个元素的值: ",i++); scanf("%d",&val); } returnpHead; } /************************遍历整个链表*********************/ voidg(pNodepHead) { pNodep; p=pHead->Next; while(p! =NULL) { printf("%d->",p->data); p=p->Next; } printf("\n"); } /*************************判断链表是否为空******************/ boolis_empty(pNodepHead) { if(pHead->Next==NULL) returnfalse; elsereturntrue; } /****************************计算链表长度*********************/ intlength(pNodepHead) { intlen=0; pNodep=pHead->Next; while(p! =NULL) { ++len; p=p->Next; } returnlen; } /****************************对链表进行排序****************************/ boolsort(pNodepHead) { inti,j,t,len=length(pHead); pNodep,q; if(len==0) returnfalse; //通过顺序存储类型排序方法,带着链表进行排序,统一思想,广义算法 for(i=0,p=pHead->Next;i for(j=i+1,q=p->Next;j if(p->data>q->data) { t=p->data; p->data=q->data; q->data=t; } returntrue; } /************************插入节点************************/ boolinsert(pNodepHead) { inti=0,val,pos; pNodep=pHead; printf("请输入需要在第几个节点前加入一个新的结点: "); scanf("%d",&pos); while(p! =NULL&&i { p=p->Next; ++i; } if(p==NULL||i>pos-1) returnfalse; pNodeNew=(pNode)malloc(sizeof(Node)); if(New==NULL) { printf("动态分配失败! \n"); exit(-1); } printf("请输入新结点的值: \n"); scanf("%d",&val); New->data=val; New->Next=p->Next; p->Next=New; returntrue; } /****************************删除节点***************************/ booldelete_list(pNodepHead,int*val) { inti=0,pos; pNodep=pHead,r; printf("请输入需要删除第几个结点的值: "); scanf("%d",&pos); while(p->Next! =NULL&&i { p=p->Next; ++i; } if(p->Next==NULL||i>pos-1) returnfalse; r=p->Next; *val=r->data; p->Next=p->Next->Next; free(r); returntrue; } /*******************************查找节点********************************/ boolseek(pNodepHead,int&n) { intval; pNodep=pHead->Next; printf("请输入所要查找的元素: "); scanf("%d",&val); while(p! =NULL) { if(p->data==val) returntrue; else { p=p->Next; n++; } } if(p==NULL) returnfalse; } /****************************链表的合并********************************/ boolMerge(pNode*pHead1,pNode*pHead2) { if(pHead1==NULL)returnpHead2; elseif(pHead2==NULL)returnpHead1; pNode*pHead3=NULL; if(pHead1->data { pHead3=pHead1; pHead3->data=Merge(pHead1->Next,pHead2); } else { pHead3=pHead2; pHead3->data=Merge(pHead1,pHead2->Next); } returnpHead3; } 链式 #include #include //定义一个结构体链表,里面分为数据域和指针域 typedefstructt { intdata; structt*Next; }Node,*pNode; pNodecreat_list(); voidg(pNode);//遍历整个链表 boolis_empty(pNode);//判断链表是否为空 intlength(pNode);//计算链表的长度 boolsort(pNode);//对链表进行排序 boolinsert(pNode);//对链表插入一个新的结点 booldelete_list(pNode,int*);//对链表删除一个已有的结点 boolseek(pNode,int&);//对链表进行元素的查找 boolMerge(pNode*pHead1,pNode*pHead2);//链表的合并 /*********************主函数******************/ voidmain() { intval; intn=1; pNodepHead; pHead=creat_list();//创造出一个动态链表,并进行封装交还给pHead g(pHead); if(sort(pHead)) { printf("经过排列后的链表为: \n"); g(pHead); } elseprintf("链表为空,无法排序! \n"); if(insert(pHead)) { printf("插入成功! \n新链表为: \n"); g(pHead); } else printf("插入失败! \n"); if(delete_list(pHead,&val)) { printf("删除成功! \n删除的元素是: %d\n",val); printf("删除后的链表为: \n"); g(pHead); } else printf("删除失败! \n"); if(seek(pHead,n)) { printf("查找成功,元素在第%d个结点上\n",n); } else printf("所查找的元素不存在! \n"); pNodepHead2; pHead2=creat_list(); if(Merge(pHead,pHead2)) { printf("合并后的链表为: "); } } /**********************创建链表******************/ pNodecreat_list() { inti=1,val; pNodepHead=(pNode)malloc(sizeof(Node)); if(pHead==NULL) { printf("分配失败! \n"); exit(-1); } pN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性