C++实现线性表的操作

来源:互联网 发布:光华6号导弹艇 知乎 编辑:程序博客网 时间:2024/06/05 01:58
#include<iostream.h>#include<stdlib.h>typedef int ElemType;struct List {ElemType *list;//存线性表元素的动态存储空间的指针int size;//存线性表长度int MaxSize;//规定list数组的长度}; //初始化L为空void InitList(List &L){ L.MaxSize=10;//初始化长度 L.list=new ElemType[L.MaxSize];//动态分配空间 if(L.list==NULL) {cout<<"动态储存空间用完,退出运行!"<<endl;exit(1); }L.size = 0;//置线性表长度为0,即为空表}//清除L中所有元素void ClearList(List &L){if(L.list!=NULL){delete []L.list;L.list=NULL;}L.MaxSize=0;L.size=0;} //返回L的长度int LenthList(List &L){return L.size;}//判断L是否为空bool EmptyList(List &L){return L.size==0;} //返回L中第pos个元素的值ElemType GetList(List &L, int pos){if(pos<1 || pos>L.size){cerr<<"pos值无效!"<<endl;}return L.list[pos-1];} //遍历输出L中的所以元素void TraverseList(List &L){for(int i=0; i<L.size; i++){cout<<L.list[i]<<' ';}cout<<endl;}//从L中查找并返回元素bool FindList(List &L, ElemType item){for(int i=0; i<L.size; i++){if(L.list[i]==item){item=L.list[i];return true;}}return false;}//修改L中的元素bool UpdateList(List &L, const ElemType item){for(int i=0; i<L.size; i++){if(L.list[i]==item){L.list[i]=item;//更新return true;}}return false;} //向L中插入元素bool InsertList(List &L, ElemType item, int pos){//判断pos的值是否合法if(pos<-1 || pos>L.size+1){cout<<"pos的值不合法!"<<endl;return false;}int i;//循环变量//判断插入的位置if(pos==0)//顺序插入{for(i=0; i<L.size; i++){if(L.list[i]>item)break;}pos=i+1;}else if(pos==-1)//插入表尾{pos=L.size+1;}//如果空间用完,则重新分配大一倍的储存空间if(L.size==L.MaxSize){int k=sizeof(ElemType);//计算每个元素储存空间的长度L.list=(ElemType*)realloc(L.list, 2*L.MaxSize*k);if(L.list==NULL){cout<<"可以空间用完,退出运行!"<<endl;exit(1);}L.MaxSize=2*L.MaxSize;//把线性表的空间大小修改为新的长度}//待插入位置的后续位置元素依次后移for(i=L.size-1; i>=pos-1; i--){L.list[i+1]=L.list[i];}//把item的值赋给已空出的下标为pos-1的位置L.list[pos-1]=item;L.size++;//线性表的长度加1return true;//返回真,表示插入成功} //从L中删除元素bool DeleteList(List &L, ElemType item, int pos){if(L.size==0)//检查线性表是否为空{cout<<"线性表为空,删除无效!"<<endl;return false;}//判断pos的值是否合法if(pos<-1 || pos>L.size+1){cout<<"pos的值不合法!"<<endl;return false;}int i;//循环变量//判断删除的位置if(pos==0)//按值删除{for(i=0; i<L.size; i++){if(L.list[i]==item)break;}if(i==L.size) return false;//无元素可删除pos=i+1;}else if(pos==-1)//删除表尾元素{pos=L.size;}item=L.list[pos-1];//将被删除元素的值赋给变参item带回//待删除位置的后续位置元素依次前移for(i=pos; i<L.size; i++){L.list[i-1]=L.list[i];}L.size--;//线性表的长度减1//如果剩余空间过大,进行缩小if(float(L.size)/L.MaxSize<0.4 && L.size>10){int k= sizeof(ElemType);L.list=(ElemType*)realloc(L.list, L.MaxSize*k/2);}L.MaxSize=L.MaxSize/2;//把线性表的空间大小修改为新的长度return true;//返回真,表示删除成功}//对L中的所元素按给定条件进行排序void SortList(List &L){int i,j;ElemType x;for(i=1; i<L.size; i++)//共循环n-1次{x=L.list[i];//把无序表中的第一个元素暂存x中for(j=i-1; j>=0; j--)//向前属性进行比较和移动{if(x<L.list[j])L.list[j+1]=L.list[j];else break;}L.list[j+1]=x;//把x写入到已经空出的位置}}//主函数void main(){int a[12]={3,6,9,12,15,18,21,24,27,30,33,36};int i;ElemType x;List t;InitList(t);for(i=0; i<12; i++){InsertList(t,a[i],i+1);}InsertList(t,48,13);InsertList(t,40,0);cout<<GetList(t,4)<<' '<<GetList(t,9)<<endl;TraverseList(t);cout<<"输入待查找的元素值:";cin>>x;if(FindList(t,x)) cout<<"查找成功!"<<endl;else cout<<"查找失败!"<<endl;cout<<"输入带删除元素的值:";cin>>x;if(DeleteList(t,x,0)) cout<<"删除成功!"<<endl;else cout<<"删除失败!"<<endl;TraverseList(t);cout<<"按值插入,输入待插入的元素的值:";cin>>x;if(InsertList(t,x,0)) cout<<"插入成功!"<<endl;else cout<<"插入失败!"<<endl;TraverseList(t);cout<<"线性表的长度:"<<LenthList(t)<<endl;if(EmptyList(t)) cout<<"线性表为空!"<<endl;else cout<<"线性表不空!"<<endl;ClearList(t);}

运行结果:


原创粉丝点击