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;isize-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;isize;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;isize-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;isize-1;i++){//排序的趟数(例如5个数据需要比较4趟)
for(intj=0;jsize-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(lowbase[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(iasize&&ibsize){
if(la->base[ia]base[ib]){
lt->base[ic++]=la->base[ia++];
}
else{
lt->base[ic++]=lb->base[ib++];
}
}
while(iasize){
lt->base[ic++]=la->base[ia++];
}
while(ibsize){
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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。