线性表的基本操作
1 /***顺序表上的基本操作实现***/ 2 3 #include <iostream> 4 5 #define SIZE 1008 6 7 #define LIST_INIT_SIZE 100 8 #define LISTINCREMENT 10 9 #define OVERFLOW 0 10 11 #define OK 1 12 #define ERROR 0 13 14 15 using namespace std; 16 17 typedef int ElemType; 18 19 typedef struct 20 { 21 ElemType *elem; 22 int length; 23 int listsize; 24 } SqList; 25 26 ///初始化 27 int InitList_Sq(SqList &L) 28 { 29 //构造一个空的线性表L 30 L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 31 if(!L.elem) 32 { 33 exit(OVERFLOW); 34 } 35 L.length = 0; 36 L.listsize = LIST_INIT_SIZE; 37 return OK; 38 } 39 40 ///线性表的创建和插入 41 int ListInsert_Sq(SqList &L,int index,ElemType ELEM) 42 { 43 ElemType *newbase,*p,*q; 44 if(1 > index||index > L.length + 1) 45 { 46 return ERROR; 47 } 48 if(L.length >= L.listsize) 49 { 50 newbase = (ElemType*)realloc(L.elem, 51 (L.listsize + LISTINCREMENT)*sizeof(ElemType)); 52 if(!newbase) 53 { 54 exit(0); 55 } 56 L.elem = newbase; 57 L.listsize += LISTINCREMENT; 58 } 59 60 q = &(L.elem[index - 1]); 61 for(p = &(L.elem[L.length - 1]); p >= q; --p) 62 { 63 *(p + 1) = *p; 64 } 65 *q = ELEM; 66 ++L.length; 67 68 return OK; 69 } 70 71 void Creat_List_Sq(SqList &L,int Length) 72 { 73 ElemType ELEM; 74 int index = 1; 75 while(index <= Length) 76 { 77 cout << "请输入元素 " << index << endl; 78 cin >> ELEM; 79 ListInsert_Sq( L, index, ELEM); 80 index ++; 81 } 82 } 83 84 ///线性表的输出 85 void Output_List_Sq(SqList L) 86 { 87 int i = 0; 88 if(L.length == 0) 89 { 90 cout << "This is a empty List."; 91 } 92 while(i < L.length) 93 { 94 cout << L.elem[i++] << " "; 95 } 96 cout << endl; 97 } 98 99 ///线性表元素删除 100 int ListDelete_Sq(SqList &L,int index,ElemType &ELEM) 101 { 102 ElemType *p,*q; 103 if(index < 1||index > L.length) 104 { 105 exit(0); 106 } 107 p = &(L.elem[index - 1]); 108 ELEM = *p; 109 q = L.elem + L.length -1; 110 for(++ p; p <= q; ++ p) 111 { 112 *(p - 1) = *p; 113 } 114 -- L.length; 115 return OK; 116 } 117 118 ///线性表元素的查找,==>二分法查找 119 int SearchList_Sq(SqList L,ElemType ELEM) 120 { 121 int low,high,mid; 122 123 low = 0; 124 high = L.length - 1; 125 126 while(low <= high) 127 { 128 mid = (low + high)/2; 129 if(ELEM > L.elem[mid]) 130 { 131 high = mid - 1; 132 } 133 else if(ELEM < L.elem[mid]) 134 { 135 low = mid + 1; 136 } 137 else 138 { 139 return mid+1; 140 } 141 } 142 return -1; 143 } 144 145 void SWAP(int *m,int *n) 146 { 147 int iTemp = *m; 148 *m = *n; 149 *n = iTemp; 150 } 151 152 ///逆转线性表元素 153 void ReversalList_Sq(SqList &L) 154 { 155 int m = 0,n = L.length - 1; 156 while(m <= n) 157 { 158 SWAP(&L.elem[m],&L.elem[n]); 159 m ++,n --; 160 } 161 162 } 163 164 ///线性表合并 165 void MergeList(SqList La,SqList Lb,SqList &Lc) 166 { 167 InitList_Sq(Lc); 168 int i,j; 169 i = j = 1; 170 int k = 0; 171 ElemType ai,bj; 172 int La_len = La.length,Lb_len = Lb.length; 173 174 while((i <= La_len)&&(j <= Lb_len)) 175 { 176 ai = La.elem[i-1]; 177 bj = Lb.elem[j-1]; 178 if(ai <= bj) 179 { 180 ListInsert_Sq(Lc, ++k, ai); 181 ++ i; 182 } 183 else 184 { 185 ListInsert_Sq(Lc, ++k, bj); 186 ++ j; 187 } 188 } 189 while(i <= La_len) 190 { 191 ai = La.elem[i-1]; 192 i ++; 193 ListInsert_Sq(Lc, ++k, ai); 194 } 195 while(j <= Lb_len) 196 { 197 bj = Lb.elem[j-1]; 198 j ++; 199 ListInsert_Sq(Lc, ++k, bj); 200 } 201 } 202 int main(void) 203 { 204 int LENGTH_La,LENGTH_Lb;//线性表La的长度 205 SqList La,Lb,Lc; // 206 207 cout << "输入线性表长度: "; 208 cin >> LENGTH_La; 209 InitList_Sq(La); 210 Creat_List_Sq(La,LENGTH_La); 211 cout << "创建好的线性表La="; 212 Output_List_Sq(La); 213 214 int index; 215 ElemType ELEM_1; 216 cout << "请输入一个数以及要插入的位置" << endl; 217 cin >> ELEM_1 >> index; 218 ListInsert_Sq( La, index, ELEM_1); 219 cout << "插入一个元素后的线性表La=" << endl; 220 Output_List_Sq(La); 221 222 cout << "请输入一个要删除的元素位置:" << endl; 223 cin >> index; 224 ListDelete_Sq( La, index, ELEM_1); 225 cout << "删除一个元素后的线性表La=" << endl; 226 Output_List_Sq(La); 227 228 cout << "请输入一个要查找的元素:" << endl; 229 cin >> ELEM_1; 230 if(SearchList_Sq(La,ELEM_1) == -1) 231 { 232 cout << "没找到" << endl; 233 } 234 else 235 { 236 cout << "找到," << ELEM_1 << "在第" << SearchList_Sq(La,ELEM_1) << "个位置" << endl; 237 } 238 239 ReversalList_Sq(La); 240 cout << "逆置后的线性表La="; 241 Output_List_Sq(La); 242 243 cout << "输入Lb线性表长度:"; 244 cin >> LENGTH_Lb; 245 InitList_Sq(Lb); 246 Creat_List_Sq(Lb,LENGTH_Lb); 247 248 MergeList( La, Lb, Lc); 249 cout << "合并La和Lb后的线性表="; 250 Output_List_Sq(Lc); 251 252 return 0; 253 }