实现顺序表的各种基本操作
1 #include<iostream> 2 #include<cstdlib> 3 using namespace std; 4 #define OK 1 5 #define ERROR 0 6 #define OVERFLOW -2 7 typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。 8 typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型 9 10 #define MAXSIZE 100 //顺序表可能达到的最大长度 11 12 typedef struct{ 13 ElemType *elem; //存储空间的基地址 14 int length; //当前长度 15 }SqList; 16 17 Status InitList_Sq(SqList &L){ //算法2.1 顺序表的初始化 18 //构造一个空的顺序表L 19 L.elem=new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间 20 if(!L.elem) exit(OVERFLOW); //存储分配失败 21 L.length=0; //空表长度为0 22 return OK; 23 } 24 25 Status ListInsert_Sq(SqList &L,int i,ElemType e){ //算法2.3 顺序表的插入 26 //在顺序表L中第i个位置之前插入新的元素e 27 //i值的合法范围是1<=i<=L.length+1 28 if(i<1 || i>L.length+1) return ERROR; //i值不合法 29 if(L.length==MAXSIZE) return ERROR; //当前存储空间已满 30 for(int j=L.length-1;j>=i-1;j--) 31 L.elem[j+1]=L.elem[j]; //插入位置及之后的元素后移 32 L.elem[i-1]=e; //将新元素e放入第i个位置 33 ++L.length; //表长增1 34 return OK; 35 } 36 37 Status findValIndex_Sq(SqList L,int &index,ElemType e){// 5.依值查找该元素在该表中的位置,Status表示状态,返回引用下标index 38 for(int i=0;i<L.length;++i){ 39 if(L.elem[i]==e){ 40 index=i+1; 41 return OK; 42 } 43 } 44 return ERROR; 45 } 46 47 Status delVal_Sq(SqList &L,int index){ //6.删除该表中一个位置的元素 48 if(index<1 || index>L.length)return ERROR; 49 for(int i=index-1;i<L.length;i++){ 50 L.elem[i]=L.elem[i+1]; //从该位置开始,后面的元素往前移,往前覆盖 51 } 52 L.length--; //表长减1 53 return OK; 54 } 55 56 Status findMax_Sq(SqList L,int &index,int &maxVal){ //7.Status表示状态,此函数返回引用最大值的下标和其最大值 57 if(L.length==0)return ERROR; 58 maxVal=L.elem[0]; //先标记首元素为最大值 59 index=1; //这时下标是1 60 for(int i=1;i<L.length;++i){ 61 if(L.elem[i]>maxVal){ 62 maxVal=L.elem[i]; 63 index=i+1; 64 } 65 } 66 return OK; 67 } 68 69 Status delMin_Sq(SqList &L,int &index,int &minVal){ //8.删除线性表中最小的元素 70 if(L.length==0)return ERROR; 71 minVal=L.elem[0];//先把首元素标记为最小值 72 index=1; //同时标记位置 73 for(int i=1;i<L.length;++i){ 74 if(L.elem[i]<minVal){ 75 minVal=L.elem[i]; 76 index=i+1; 77 } 78 } 79 for(int j=index-1;j<L.length;++j) 80 L.elem[j]=L.elem[j+1]; //后面的元素往前移 81 L.length--; //表长减1 82 return OK; 83 } 84 85 Status DelItem_Sq(SqList &L,int item){ //9.删除表中所有值为item的元素 此算法的时间复杂度是O(n),空间复杂度是O(1) 86 int i=0,j=L.length-1; //用两个指针来扫描顺序表 87 while(i<j){ //两个指针没有相遇的时候 88 while(i<j && L.elem[i]!=item)//当当前i扫描到与item相等时即跳出与后面不与item相等的值交换 89 ++i; 90 if(i<j){ //先判断i<j,从后面往前扫描,如果是与item相等的话,j往前移 91 while(i<j && L.elem[j]==item) 92 --j; 93 } 94 if(i<j)//如果当前i<j时 95 L.elem[i++]=L.elem[j--]; //将尾元素的值赋予当前指向的i的值(其与item相等) 96 } 97 if(j==L.length-1)return ERROR; 98 else { 99 L.length=j+1;//将j+1赋予L.length,因为实际下标是从表长-1开始 100 return OK; 101 } 102 } 103 104 int main() 105 { 106 SqList L; 107 int i,choose,index; //此处定义了index用作线性表的下标位置 108 ElemType x; 109 choose=-1; 110 while(choose!=0) 111 { 112 cout<<"**********************************************************************\n"; 113 cout<<"1. 建立空表 2. 在表中输入指定个数元素\n"; 114 cout<<"3. 在第i个元素的前面插入一个元素 4. 逐个显示表中元素\n"; 115 cout<<"5. 依值查找 6. 删除表中第i个元素\n"; 116 cout<<"7. 返回表中值最大元素及其在表中位置 8. 删除线性表中值最小的数据元素\n"; 117 cout<<"9. 删除表中所有值为item的元素 0. 退出\n"; 118 cout<<"**********************************************************************\n"; 119 120 cout<<"请选择:"; 121 cin>>choose; 122 switch(choose) 123 { 124 case 1: 125 if(InitList_Sq(L)) //创建顺序表 126 cout<<"成功建立顺序表\n\n"; 127 else 128 cout<<"顺序表建立失败\n\n"; 129 break; 130 case 2: 131 cout<<"请输入一个数,代表元素的个数:"; //初始化指定个数元素 132 cin>>L.length; 133 cout<<"请输入"<<L.length<<"个元素的数据(以空格隔开,按回车结束):\n"; 134 for(i=0;i<L.length;i++) 135 cin>>L.elem[i]; 136 cout<<endl; 137 break; 138 case 3: //顺序表的插入 139 cout<<"请输入两个数,分别代表插入的位置和插入数值(用空格间隔,最后回车):"; 140 cin>>i>>x; //输入a和b,a代表插入的位置,b代表插入的数值 141 if(ListInsert_Sq(L,i,x)) 142 cout<<"插入成功.\n\n"; 143 else 144 cout<<"插入失败.\n\n"; 145 break; 146 case 4: //顺序表的输出 147 if(L.length==0) 148 cout<<"当前为空表"<<endl<<endl; 149 else { 150 cout<<"当前顺序表为:"; 151 for(i=0;i<L.length;i++) 152 cout<<L.elem[i]<<" "; 153 cout<<",表有"<<L.length<<"个元素。"<<endl<<endl; 154 } 155 break; 156 case 5://依值查找 157 index=-1; //输入元素找该元素的下标 158 cout<<"请输入要查找的一个元素位置的元素:"; 159 cin>>x; 160 if(findValIndex_Sq(L,index,x)) 161 cout<<"该元素在该表中的位置是"<<index<<".\n"<<endl; 162 else 163 cout<<"该表中找不到该元素"<<endl<<endl; 164 break; 165 case 6: //删除表中第i个元素 166 index=-1; //用来输入要删除元素的下标 167 cout<<"请输入要删除该表中元素的位置:"; 168 cin>>index; 169 if(delVal_Sq(L,index)) 170 cout<<"表示删除成功"<<endl<<endl; 171 else 172 cout<<"表示这个位置没有元素"<<endl<<endl; 173 break; 174 case 7: //返回表中值最大元素及其在表中位置 175 ElemType maxVal; //得到最大值 176 index=-1; 177 if(findMax_Sq(L,index,maxVal)) 178 cout<<"该表中最大元素为"<<maxVal<<";其对应位置为"<<index<<".\n"<<endl; 179 else 180 cout<<"该表中没有元素"<<endl; 181 break; 182 case 8: //删除线性表中值最小的数据元素 183 ElemType minVal; //标记该线性表中最小的元素 184 index=-1; //标记最小元素的下标 185 if(delMin_Sq(L,index,minVal)) 186 cout<<"已经删除了此线性表中最小的元素:"<<minVal<<";其原本的位置为"<<index<<".\n"<<endl; 187 else 188 cout<<"当前表为空表"<<endl<<endl; 189 break; 190 case 9: //删除表中所有值为item的元素 191 if(L.length==0) 192 cout<<"当前为空表"<<endl<<endl; 193 else{ 194 ElemType item; //定义要删除的item值 195 cout<<"请输入表中你想要删除的一个元素:"; 196 cin>>item; 197 if(DelItem_Sq(L,item)) 198 cout<<"已经删除了该表中所有为"<<item<<"的元素"<<endl<<endl; 199 else 200 cout<<"该表中不存在"<<item<<"这个元素"<<endl; 201 } 202 break; 203 } 204 } 205 return 0; 206 }