数据结构——单链表及其操作
Posted クトリ・ノタ・セニオリス
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构——单链表及其操作相关的知识,希望对你有一定的参考价值。
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 }
以上是关于数据结构——单链表及其操作的主要内容,如果未能解决你的问题,请参考以下文章