tangzhide 2018-07-01
下面是顺序表的基本操作,c语言版的数据结构书上写的操作都实现了
因为总体代码太长如果写在一个class中要近500行,阅读和修改都不方便,所以采用分开写,希望大家以后写较长的程序时也采用这种方法,自己运行的所有功能都能实现,而且个人感觉界面还是比较人性化的,大家还有什么意见或者程序有什么问题都可以在评论区提出,我会及时修改的。
[cpp] view plain copy
seqlist.h #ifndef SEQLIST_H #define SEQLIST_H #include <stdio.h> #include <malloc.h> #define SEQLISR_INIT_SIZE 5 #define INC_SIZE 3 typedef int ElemType; typedef struct Seqlist { ElemType *base;//指针域 int capacity;//顺序表容量 int size;//表的大小 }Seqlist; void create_list(Seqlist *list);//顺序表元素的输入 bool Inc(Seqlist *list);//增加顺序表的容量 void InitSeqlist(Seqlist *list);//初始化顺序表 void push_back(Seqlist *list,ElemType x);//在顺序表的末尾插入元素 void push_front(Seqlist *list,ElemType x);//在顺序表的头部插入元素 void show_list(Seqlist *list);//显示顺序表的元素 void pop_back(Seqlist *list);//删除顺序表的最后一个元素 void pop_front(Seqlist *list);//删除顺序表的第一个元素 void insert_pos(Seqlist *list,int pos,ElemType x);//在顺序表的指定位置插入数据 int find(Seqlist *list,ElemType key);//查找元素key的下标 int length(Seqlist *list);//求顺序表的长度 void delete_pos(Seqlist *list,int pos);//删除顺序表中指定位置的数据 void delete_val(Seqlist *list,int key);//删除顺序表中值为key的元素 void sort(Seqlist *list);//冒泡排序 void reverse(Seqlist *list);//逆置顺序表 void clear(Seqlist *list);//清除顺序表中的所有元素 void destroy(Seqlist *list);//摧毁顺序表 void merge(Seqlist *lt,Seqlist *la,Seqlist *lb);//吧两个表合为一个表 #endif // SEQLIST_H seqlist.cpp #include "seqlist.h" void InitSeqlist(Seqlist *list)//初始化顺序表,创建一个名字为List的线性表,list通过结构体定义 { list->base=(ElemType*)malloc(sizeof(ElemType)*SEQLISR_INIT_SIZE);//对表list分配空间 if(!list->base) exit(-1); list->capacity=SEQLISR_INIT_SIZE;//顺序表的容量 list->size=0;//顺序表的大小/长度,表示当前顺序表中无任何内容 } bool Inc(Seqlist *list)//增加顺序表的容量 { ElemType *newbase=(ElemType*)realloc(list,sizeof(ElemType)*(list->capacity+INC_SIZE));//重新分配内存空间,增减INC个容量 if(newbase==NULL) printf("内存分配失败!"); list->base=newbase; list->capacity+=INC_SIZE; } void create_list(Seqlist *list) { int i,x; printf("请确定输入元素的个数:"); scanf("%d",&i); printf("请输入元素 "); for(int j=0; j<i; j++) { scanf("%d",&x); list->base[j]=x; } list->size=i; } void push_back(Seqlist *list,ElemType x)//在顺序表的尾部插入元素 { if(list->size>=list->capacity&&!Inc(list)) { printf("顺序表已满,无法在尾部插入新元素"); return; } list->base[list->size]=x; list->size++; } void push_front(Seqlist *list,ElemType x)//在顺序表头部插入新元素 { if(list->size>=list->capacity&&!Inc(list)) { printf("顺序表已满,无法在尾部插入新元素"); return; } for(int i=list->size; i>0; i--) { list->base[i]=list->base[i-1]; } list->base[0]=x; list->size++; } void show_list(Seqlist *list)//顺序表的打印输出 { for(int i=0; i<list->size; i++) { printf("%d ",list->base[i]); } } void pop_front(Seqlist *list)//删除表头元素 { if(list->size==0) { printf("顺序表为空,无法删除元素"); return; } for(int i=0; i<list->size-1; i++) { list->base[i]=list->base[i+1]; } list->size--; } void pop_back(Seqlist *list)//删除最后一个元素 { if(list->size==0) { printf("顺序表为空,无法删除元素"); return; } list->size--;//这也太聪明了,直接减少一个元素 } int length(Seqlist *list) { return list->size; } void insert_pos(Seqlist *list,int pos,ElemType x)//在指定位置插入元素 { if(pos<0||pos>list->size) { printf("插入位置不合法,无法插入元素"); return; } if(list) for(int i=list->size; i>pos; i--) { list->base[i]=list->base[i-1]; } list->base[pos]=x; list->size++; } int find(Seqlist *list,ElemType key)//寻找key的位置 { for(int i=0; i<list->size; i++) { if(list->base[i]==key) return i; } return -1; } void delete_pos(Seqlist *list,int pos)//删除指定位置的元素 { if(pos<0||pos>=list->size) { printf("删除位置不合法"); return; } for(int i=pos; i<list->size-1; i++) { list->base[i]=list->base[i+1]; } list->base--; } void delete_val(Seqlist *list,int key)//删除指定元素 { int pos=find(list,key); if(pos==-1) { printf("顺序表中没有这个元素"); return; } delete_pos(list,pos); } void sort(Seqlist *list) { for (int i = 0; i < list->size - 1; i++) //排序的趟数(例如5个数据需要比较4趟) { for (int j = 0; j < list->size - 1 - i; j++) //每一趟比较中的比较次数(例如5个数据在第0趟需要比较4次) { if (list->base[j] > list->base[j + 1]) { ElemType temp = list->base[j]; list->base[j] = list->base[j + 1]; list->base[j + 1] = temp; } } } } void reverse(Seqlist *list)//将顺序表倒置 { if(list->size==0||list->size==1) return; int low=0,high=list->size-1; while(low<high) { ElemType temp=list->base[low]; list->base[low]=list->base[high]; list->base[high]=temp; low++; high--; } } void clear(Seqlist *list) { list->size=0; } void destroy(Seqlist *list)//摧毁顺序表 { free(list->base); list->base=NULL; list->capacity=0; list->size=0; } void merge(Seqlist *lt,Seqlist *la,Seqlist *lb)//把两个顺序表合并为一个 { lt->capacity=la->size+lb->size; lt->base=(ElemType*)malloc(sizeof(ElemType)*lt->capacity); if(!lb->base) exit(-1); int ia=0,ib=0,ic=0; while(ia<la->size&&ib<lb->size) { if(la->base[ia]<lb->base[ib]) { lt->base[ic++]=la->base[ia++]; } else { lt->base[ic++]=lb->base[ib++]; } } while(ia<la->size) { lt->base[ic++]=la->base[ia++]; } while(ib<lb->size) { lt->base[ic++]=lb->base[ib++]; } lt->size=la->size+lb->size; show_list(lt); }
#include "seqlist.h" int main() { Seqlist list; InitSeqlist(&list); //create_list(&list); ElemType item; int pos; int select=1; printf("******************************************* "); printf("*[1] push_back [2] push_front * "); printf("*[3] show_list [4] pop_back * "); printf("*[5] pop_front [6] insert_pos * "); printf("*[7] find [8] length * "); printf("*[9] delete_pos [10] delete_value * "); printf("*[11] sort [12] reverse * "); printf("*[13] clear [14] merge * "); printf("*[0] quit_system * "); printf("******************************************* "); while(select) { printf("请选择:>>"); scanf("%d",&select); if(select==0) break; switch(select) { case 1: printf("请输入要插入的数据(-1结束)"); while(scanf("%d",&item),item!=-1) { push_back(&list,item); } break; case 2: printf("请输入要插入的数据(-1结束)"); while(scanf("%d",&item),item!=-1) { push_front(&list,item); } break; case 3: show_list(&list); break; case 4: pop_back(&list); break; case 5: pop_front(&list); break; case 6: printf("请输入要插入的数据:"); scanf("%d",&item); printf("请输入要插入的位置:"); scanf("%d",&pos); insert_pos(&list,pos,item); break; case 7: printf("请输入要查找的数据:"); scanf("%d",&item); pos=find(&list,item); if(pos=-1) printf("要查找的元素不在顺序表中"); else printf("查找元素的在顺序表中的下标位置为:%d ",pos); break; case 8: printf("顺序表的长度为%d",length(&list)); break; case 9: printf("请输入要删除的值的下标位置:"); scanf("%d",&pos); delete_pos(&list,pos); break; case 10: printf("请输入哟啊删除的值"); scanf("%d",&item); delete_val(&list,item); break; case 11: sort(&list); break; case 12: reverse(&list); break; case 13: clear(&list); break; case 14: Seqlist mylist,yourlist; ElemType item1,item2; InitSeqlist(&mylist); InitSeqlist(&yourlist); printf("请输入顺序表1中的元素值"); while(scanf("%d",&item1),item1!=-1) { push_back(&mylist,item1); } printf("请输入顺序表2中的元素值"); while(scanf("%d",&item2),item2!=-1) { push_back(&yourlist,item2!=-1); } merge(&list,&mylist,&yourlist); destroy(&mylist); destroy(&yourlist); break; case 15: create_list(&list);//顺序表的创建,输入数据 break; default: printf("输入的选择错误"); break; } } destroy(&list); }