C语言实现的顺序表功能完整实例
本文实例讲述了C语言实现的顺序表功能。分享给大家供大家参考,具体如下:
seqlist.h
#ifndef__SEQLIST_H__ #define__SEQLIST_H__ #include#include #include #defineSEQLIST_INIT_SIZE8 #defineINC_SIZE3//空间增量的大小 typedefintElemType; typedefstructSeqlist{ ElemType*base; intcapacity;//顺序表容量 intsize;//表的大小 }Seqlist; boolInc(Seqlist*list);//增加顺序表的容量 voidInitSeqlist(Seqlist*list);//初始化顺序表 voidpush_back(Seqlist*list,ElemTypex);//在顺序表的末尾插入元素 voidpush_front(Seqlist*list,ElemTypex);//在顺序表的头部插入元素 voidshow_list(Seqlist*list);//显示顺序表中的元素 voidpop_back(Seqlist*list);//删除顺序表最后一个元素 voidpop_front(Seqlist*list);//删除顺序表第一个元素 voidinsert_pos(Seqlist*list,intpos,ElemTypex);//在顺序表的选定位置上插入数据 intfind(Seqlist*list,ElemTypekey);//在顺序表中查找元素key的下标 intlength(Seqlist*list);//求顺序表的长度 voiddelete_pos(Seqlist*list,intpos);//删除顺序表中特定位置的数据元素 voiddelete_val(Seqlist*list,intkey);//删除顺序表中值为key的数据元素 voidsort(Seqlist*list);//冒泡排序 voidreverse(Seqlist*list);//逆置顺序列表 voidclear(Seqlist*list);//清除顺序表中的所有元素 voiddestroy(Seqlist*list);//摧毁顺序表 voidmerge(Seqlist*lt,Seqlist*la,Seqlist*lb);//合并两个顺序列表 #endif//__SEQLIST_H__
seqlist.cpp
#include"seqlist.h" boolInc(Seqlist*list){ ElemType*newbase=(ElemType*)realloc(list,sizeof(ElemType)*(list->capacity+INC_SIZE));//重新分配内存空间 if(newbase==NULL){ printf("内存空间已满,无法再分配内存空间!\n"); returnfalse; } list->base=newbase; list->capacity+=INC_SIZE; returntrue; } voidInitSeqlist(Seqlist*list){ list->base=(ElemType*)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE); assert(list->base!=NULL); list->capacity=SEQLIST_INIT_SIZE; list->size=0; } voidpush_back(Seqlist*list,ElemTypex){ if(list->size>=list->capacity&&!Inc(list)){//Inc(list)用来判断增加顺序表容量是否成功,只有在失败的情况下才会进入if语句中 printf("顺序表容量已满,无法再在表尾继续插入新元素!\n"); return; } list->base[list->size]=x; list->size++; } voidpush_front(Seqlist*list,ElemTypex){ if(list->size>=list->capacity&&!Inc(list)){ printf("顺序表容量已满,无法再在表头插入新元素!\n"); return; } for(inti=list->size;i>0;i--){ list->base[i]=list->base[i-1]; } list->base[0]=x; list->size++; } voidshow_list(Seqlist*list){ for(inti=0;isize;i++){ printf("%d",list->base[i]); } printf("\n"); } voidpop_back(Seqlist*list){ if(list->size==0){ printf("顺序表已空,无法再在表尾删除元素!\n"); return; } list->size--; } voidpop_front(Seqlist*list){ if(list->size==0){ printf("顺序表已空,无法再在表头删除元素!\n"); return; } for(inti=0;i size-1;i++){ list->base[i]=list->base[i+1]; } list->size--; } voidinsert_pos(Seqlist*list,intpos,ElemTypex){ if(pos<0||pos>list->size){ printf("插入位置不合法,无法插入元素!\n"); return; } if(list->size>=list->capacity&&!Inc(list)){ printf("顺序表容量已满,无法在插入新的元素!\n"); return; } for(inti=list->size;i>pos;i--){ list->base[i]=list->base[i-1]; } list->base[pos]=x; list->size++; } intfind(Seqlist*list,ElemTypekey){ for(inti=0;i size;i++){ if(list->base[i]==key) returni; } return-1; } intlength(Seqlist*list){ returnlist->size; } voiddelete_pos(Seqlist*list,intpos){ if(pos<0||pos>=list->size){ printf("删除位置不合法,无法删除元素!\n"); return; } for(inti=pos;i size-1;i++){ list->base[i]=list->base[i+1]; } list->size--; } voiddelete_val(Seqlist*list,intkey){ intpos=find(list,key); if(pos==-1){ printf("顺序表中没有这个元素!\n"); return; } delete_pos(list,pos); } voidsort(Seqlist*list){ for(inti=0;i size-1;i++){//排序的趟数(例如5个数据需要比较4趟) for(intj=0;j size-1-i;j++){//每一趟比较中的比较次数(例如5个数据在第0趟需要比较4次) if(list->base[j]>list->base[j+1]){ ElemTypetemp=list->base[j]; list->base[j]=list->base[j+1]; list->base[j+1]=temp; } } } } voidreverse(Seqlist*list){ if(list->size==0||list->size==1)return; intlow=0,high=list->size-1; while(low base[low]; list->base[low]=list->base[high]; list->base[high]=temp; low++; high--; } } voidclear(Seqlist*list){ list->size=0; } voiddestroy(Seqlist*list){ free(list->base); list->base=NULL; list->capacity=0; list->size=0; } voidmerge(Seqlist*lt,Seqlist*la,Seqlist*lb){ lt->capacity=la->size+lb->size; lt->base=(ElemType*)malloc(sizeof(ElemType)*lt->capacity); assert(lt->base!=NULL); intia=0,ib=0,ic=0; while(ia size&&ib size){ if(la->base[ia] base[ib]){ lt->base[ic++]=la->base[ia++]; } else{ lt->base[ic++]=lb->base[ib++]; } } while(ia size){ lt->base[ic++]=la->base[ia++]; } while(ib size){ lt->base[ic++]=lb->base[ib++]; } lt->size=la->size+lb->size; show_list(lt); }
main.cpp
#include"seqlist.h" voidmain(){ Seqlistlist; InitSeqlist(&list); ElemTypeitem; intpos; intselect=1; while(select){ printf("*******************************************\n"); printf("*[1]push_back[2]push_front*\n"); printf("*[3]show_list[4]pop_back*\n"); printf("*[5]pop_front[6]insert_pos*\n"); printf("*[7]find[8]length*\n"); printf("*[9]delete_pos[10]delete_value*\n"); printf("*[11]sort[12]reverse*\n"); printf("*[13]clear[14]merge*\n"); printf("*[0]quit_system*\n"); printf("*******************************************\n"); printf("请选择:>>"); scanf("%d",&select); if(select==0)break; switch(select){ case1: printf("请输入要插入的数据(-1结束):>"); while(scanf("%d",&item),item!=-1){//先输入item的值,只要item不等于-1就接着循环 push_back(&list,item); } break; case2: printf("请输入要插入的数据(-1结束):>"); while(scanf("%d",&item),item!=-1){ push_front(&list,item); } break; case3: show_list(&list); break; case4: pop_back(&list); break; case5: pop_front(&list); break; case6: printf("请输入要插入的数据:>"); scanf("%d",&item); printf("请输入要插入的位置:>"); scanf("%d",&pos); insert_pos(&list,pos,item); break; case7: printf("请输入要查找的数据:>"); scanf("%d",&item); pos=find(&list,item); if(pos==-1) printf("查找的数据元素不在顺序表中!\n"); else printf("查找的数据元素在顺序表中的下标位置为%d\n",pos); break; case8: printf("顺序表的长度为%d\n",length(&list)); break; case9: printf("请输入要删除数据在顺序表中的下标位置:>"); scanf("%d",&pos); delete_pos(&list,pos); break; case10: printf("请输入要删除数据的值:>"); scanf("%d",&item); delete_val(&list,item); break; case11: sort(&list); break; case12: reverse(&list); break; case13: clear(&list); break; case14: Seqlistmylist,yourlist; ElemTypeitem1,item2; InitSeqlist(&mylist); InitSeqlist(&yourlist); printf("请输入顺序表1中的元素值(-1结束):>"); while(scanf("%d",&item1),item1!=-1){ push_back(&mylist,item1); } printf("请输入顺序表2中的元素值(-1结束):>"); while(scanf("%d",&item2),item2!=-1){ push_back(&yourlist,item2); } merge(&list,&mylist,&yourlist); destroy(&mylist); destroy(&yourlist); break; default: printf("输入的选择错误!请重新输入!\n"); break; } } destroy(&list); }
希望本文所述对大家C语言程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。