數據結構——單鏈表及其操作
阿新 • • 發佈:2018-05-21
位置 esp CA 註意 namespace 元素 tde 初始化 new
1 #include<iostream> 2 #include<string> 3 #include<stdlib.h> 4 5 using namespace std; 6 7 typedef int ElemType; 8 typedef int Status; 9 #define OK 1 10 #define ERROR 0 11 12 13 //單鏈表的存儲結構 14 typedef struct LNode 15 { 16 ElemType data; //結點的數據域17 struct LNode *next; //結點的指針域 18 }LNode,*LinkList; //LinkList為指向結構體LNode的指針類型 19 20 21 //初始化 22 Status InitList(LinkList &L) 23 { 24 L = new LNode; //生成新結點作為頭結點,用頭指針L指向頭結點 25 26 if (!L) //分配失敗 27 return ERROR; 28 29 L->next = NULL; //頭結點的指針域置空 30 return OK; 31 } 32 33 34 //前插法創建單鏈表 35 //逆位序輸入n個元素的值,建立帶表頭結點的單鏈表L 36 void CreateList_H(LinkList &L,int n) 37 { 38 LinkList p; 39 40 L = new LNode; 41 L->next = NULL; //先建立一個帶頭結點的空鏈表 42 43 cout << "請依次輸入" << n << "個元素:" << endl;44 45 for (int i = 0; i < n; i++) 46 { 47 p = new LNode; //生成新結點*p 48 cin >> p->data; //輸入元素值賦給新結點*p的數據域 49 p->next = L->next; 50 L->next = p; //將新結點*p插入到頭結點之後 (註意次序不能顛倒!!! 51 } 52 } 53 54 55 //尾插法創建單鏈表 56 void CreateList_R(LinkList &L, int n) 57 { 58 LinkList s, r; 59 60 L = new LNode; 61 L->next = NULL; //先創建一個帶頭結點的空鏈表 62 63 r = L; //尾指針r指向頭結點 64 65 cout << "請依次輸入" << n << "個元素:" << endl; 66 67 for (int i = 0; i < n; i++) 68 { 69 s = new LNode; 70 cin >> s->data; 71 72 s->next = NULL; 73 r->next = s; 74 75 r = s; //更新r的指向,r指向新的尾節點s 76 } 77 } 78 79 80 //取值 81 //在帶頭結點的單鏈表L中根據序號i獲取元素的值,用e返回L中第i個數據元素的值 82 Status GetElem(LinkList L, int i, ElemType &e) 83 { 84 LinkList p; 85 86 p = L->next; //初始化,p指向首元結點 87 int j = 1; //計數器 88 while (p && j < i) 89 { 90 p = p->next; //p指向下一個結點 91 j++; 92 } 93 if (!p || j > i) 94 return ERROR; //i值不合法,i>n 或 i<=0 95 96 e = p->data; 97 return OK; 98 } 99 100 101 //查找 102 //在帶頭結點的單鏈表L中查找值為e的元素 103 Status LocateElem(LinkList L, ElemType e) 104 { 105 LinkList p; 106 107 p = L->next; //初始化,p指向首元結點 108 109 while (p && p->data != e) //順鏈域向後掃描,直到p為空或p所指向的結點數據域等於e 110 { 111 p = p->next; 112 } 113 114 if (!p) 115 return ERROR; 116 117 return OK; 118 } 119 120 121 //插入 122 //在帶頭結點的單鏈表L中第i個位置插入值為e的新結點 123 Status ListInsert(LinkList &L, int i, ElemType e) 124 { 125 LinkList p; 126 p = L; 127 int j = 0; 128 129 while (p && (j < i - 1)) //查找第i-1個結點,p指向該結點 130 { 131 p = p->next; 132 j++; 133 } 134 if (!p || j > i - 1) 135 return ERROR; 136 137 LinkList s; 138 s = new LNode; 139 140 s->data = e; 141 s->next = p->next; 142 p->next = s; 143 //註意這裏的次序!!! 144 145 return OK; 146 } 147 148 149 //刪除 150 //在帶頭結點的單鏈表L中,刪除第i個元素 151 Status ListDelete(LinkList &L, int i) 152 { 153 LinkList p, q; 154 p = L; 155 int j = 0; 156 while ((p->next) && (j < i - 1)) //查找第i-1個結點,p指向該結點 157 { 158 p = p->next; 159 j++; 160 } 161 if (!(p->next) || (j > i - 1)) 162 return ERROR; 163 164 q = p->next; 165 p->next = q->next; 166 167 delete q; 168 169 return OK; 170 } 171 172 173 //單鏈表的輸出 174 void print_List(LinkList L) 175 { 176 LinkList p; 177 178 p = L->next; 179 180 while (p) 181 { 182 cout << p->data << " "; 183 p = p->next; 184 } 185 cout << endl; 186 } 187 188 189 int main() 190 { 191 int i, x, e, n, choose; 192 LinkList L; 193 L = NULL; //這裏不初始化為空,後面操作的時候vs上會報錯,不太懂╮(╯▽╰)╭ 194 195 cout << "1. 初始化\n"; 196 197 cout << "2. 前插法創建單鏈表\n"; 198 199 cout << "3. 尾插法創建單鏈表\n"; 200 201 cout << "4. 取值\n"; 202 203 cout << "5. 查找\n"; 204 205 cout << "6. 插入\n"; 206 207 cout << "7. 刪除\n"; 208 209 cout << "8. 輸出\n"; 210 211 cout << "0. 退出\n"; 212 213 choose = -1; 214 215 while (choose != 0) 216 { 217 cout << "請選擇操作:" << endl; 218 cin >> choose; 219 220 switch (choose) 221 { 222 case 1://初始化 223 if (InitList(L)) 224 cout << "成功初始化一個空的單鏈表!\n"; 225 cout << endl; 226 break; 227 228 case 2://前插法創建單鏈表 229 cout << "請輸入所要創建的單鏈表的長度:"; 230 cin >> n; 231 CreateList_H(L, n); 232 cout << endl; 233 break; 234 235 case 3://尾插法創建單鏈表 236 cout << "請輸入所要創建的單鏈表的長度:"; 237 cin >> n; 238 CreateList_R(L, n); 239 cout << endl; 240 break; 241 242 case 4://單鏈表的取值 243 cout << "請輸入您要選取的元素的位置:"; 244 cin >> i; 245 if (GetElem(L, i, e)) 246 { 247 cout << "選取成功!" << endl; 248 cout << "第" << i << "個元素是:" << e << endl; 249 } 250 else 251 cout << "選取失敗!" << endl; 252 cout << endl; 253 break; 254 255 case 5://單鏈表的查找 256 cout << "請輸入您要查找的元素:"; 257 cin >> x; 258 if (LocateElem(L, x)) 259 cout << "查找成功!" << endl; 260 else 261 cout << "查找失敗!" << endl; 262 cout << endl; 263 break; 264 265 case 6://單鏈表的插入 266 cout << "請輸入選擇插入的位置和元素:"; 267 cin >> i >> x; 268 if (ListInsert(L, i, x)) 269 cout << "插入成功!" << endl; 270 else 271 cout << "插入失敗!" << endl; 272 cout << endl; 273 break; 274 275 case 7://單鏈表的刪除 276 cout << "請輸入所要刪除的元素位置:"; 277 cin >> i; 278 if (ListDelete(L, i)) 279 cout << "刪除成功!" << endl; 280 else 281 cout << "刪除失敗!" << endl; 282 cout << endl; 283 break; 284 285 case 8://單鏈表的輸出 286 cout << "當前單鏈表中元素為:" << endl; 287 print_List(L); 288 cout << endl; 289 break; 290 } 291 } 292 return 0; 293 }
數據結構——單鏈表及其操作