经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
链表调通 - ting-1112
来源:cnblogs  作者:ting-1112  时间:2020/12/28 9:55:25  对本文有异议

数据结构-链表

新手学习,代码还很死板,不灵活。期待改进。

环境:vc6

语言:c 

运行结果: $ 为结束符号,不会读入$

  1. qwe$
  2. 全部元素为:qwe
  3. 一共有:3个元素
  4. 查找节点的内容,元素序号为:2
  5. 2:w
  6. 查找节点的位置,内容为:e
  7. e:3
  8. 删除节点,节点的位置:1
  9. 删除内容为:q
  10. 剩余元素为:we
  11. i插入e:2r
  12. 全部元素为:wre
  13. 排序后元素为:erw
  14. 新链表q:ert$
  15. q合并p后:全部元素为:erwert
  16. Press any key to continue

 

全部代码:

  1. 1 #include "stdio.h"
  2. 2 #include "malloc.h"
  3. 3 #include "string.h"
  4. 4
  5. 5 typedef struct Node
  6. 6 {
  7. 7 char data;
  8. 8 struct Node * next;
  9. 9 }Node, *LinkList;/* LinkList为结构指针类型*/
  10. 10
  11. 11 //创建一个链表
  12. 12 LinkList CreateFromHead();//头插
  13. 13 LinkList CreateFromTail(); //尾插/*将新增的字符追加到链表的末尾*/
  14. 14
  15. 15 int ListLength(LinkList L); //L为带头结点的链表求长度
  16. 16 //查找
  17. 17 Node * Get2(LinkList L, int i);//按元素序号查找
  18. 18 Node *Locate2(LinkList L,char key);//按元素值查找
  19. 19 void Get1(LinkList L, int i);//按元素序号查找
  20. 20 void Locate1(LinkList L,char key);//按元素值查找
  21. 21 //更改
  22. 22
  23. 23 //删除
  24. 24 void DelList(LinkList L,int i,char *e);//删除结点 序号
  25. 25 //插入
  26. 26 void InsList(LinkList L,int i,char e);//插入结点
  27. 27 //合并
  28. 28 LinkList Merge(LinkList LA, LinkList LB);
  29. 29 //排序
  30. 30 void sore(LinkList head);
  31. 31 //打印
  32. 32 void printList(LinkList L);
  33. 33
  34. 34 //合并 有序
  35. 35 LinkList MergeLinkList(LinkList LA, LinkList LB);//两个从小到大有序链表合并成为有序链表 LC
  36. 36
  37. 37 int main()
  38. 38 { /* LinkList为结构指针类型*/
  39. 39 Node *p, *q;
  40. 40 char c, e;
  41. 41 int i;
  42. 42
  43. 43 p = (Node*)malloc(sizeof(Node));
  44. 44 p = CreateFromTail();
  45. 45
  46. 46 printf("全部元素为:");
  47. 47 printList(p);
  48. 48 printf("\n一共有:%d个元素\n", ListLength(p));
  49. 49
  50. 50 //查找
  51. 51 printf("查找节点的内容,元素序号为:");
  52. 52 scanf("%d", &i);
  53. 53 Get1(p, i);
  54. 54 printf("查找节点的位置,内容为:");
  55. 55 scanf(" %c", &c);
  56. 56 Locate1(p,c);
  57. 57 //删除
  58. 58 printf("删除节点,节点的位置:");
  59. 59 scanf("%d", &i);
  60. 60 DelList(p,i,&e);
  61. 61 printf("删除内容为:%c\n", e);
  62. 62 printf("剩余元素为:");
  63. 63 printList(p);
  64. 64 printf("\n");
  65. 65 //插入
  66. 66 printf("在i插入e:");
  67. 67 scanf("%d%c", &i, &e);
  68. 68 InsList(p,i,e);
  69. 69 printf("全部元素为:");
  70. 70 printList(p);
  71. 71 printf("\n");
  72. 72
  73. 73 //排序
  74. 74 sore(p);
  75. 75 printf("排序后元素为:");
  76. 76 printList(p);
  77. 77 printf("\n");
  78. 78
  79. 79 printf("新链表q:");
  80. 80 q = (Node*)malloc(sizeof(Node));
  81. 81 q = CreateFromTail();
  82. 82
  83. 83 //合并
  84. 84 printf("q合并p后:");
  85. 85 //q 为NULL !!
  86. 86 p = Merge(p, q);
  87. 87
  88. 88 printf("全部元素为:");
  89. 89 printList(p);
  90. 90 printf("\n");
  91. 91 /*
  92. 92 //有序合并
  93. 93 p = MergeLinkList(q, p);
  94. 94 printf("合并后全部元素为:");//(原来的两个链表本来就有序,p长度短)
  95. 95 printList(p);
  96. 96 printf("\n");
  97. 97 */
  98. 98
  99. 99 return 0;
  100. 100 }
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106 //头插
  107. 107 LinkList CreateFromHead()
  108. 108 {
  109. 109 int flag=1;
  110. 110 LinkList L;
  111. 111 Node *s;
  112. 112 char c;
  113. 113 L=(LinkList)malloc(sizeof(Node));
  114. 114 L->next=NULL;
  115. 115
  116. 116 while(flag) //因为flag是1,所以进入循环体执行
  117. 117 {
  118. 118 scanf("%c", &c);
  119. 119 //c = getchar(); //假设用户输入ab$,首先读入‘a’
  120. 120 if(c !='$') //‘a’不等于‘$’,因此判断成立
  121. 121 {
  122. 122 s=(Node*)malloc(sizeof(Node));
  123. 123 s->data=c;
  124. 124 s->next=L->next;
  125. 125 L->next=s;
  126. 126 }
  127. 127 }
  128. 128 return L;
  129. 129 }
  130. 130 //尾插
  131. 131 LinkList CreateFromTail() /*将新增的字符追加到链表的末尾*/
  132. 132 {
  133. 133 char c;
  134. 134 LinkList L;
  135. 135 Node *r, *s;
  136. 136 L=(LinkList)malloc(sizeof(Node));
  137. 137 L->next=NULL;
  138. 138 r=L; /*r指针始终动态指向链表的当前表尾*/
  139. 139 fflush(stdin);
  140. 140 c=getchar();
  141. 141 while(c!='$')/*输入“$”时flag为0,建表结束*/
  142. 142 {
  143. 143
  144. 144 s=(LinkList)malloc(sizeof(Node));
  145. 145 s->data=c;
  146. 146 r->next=s;
  147. 147 r=s;
  148. 148 c=getchar();
  149. 149 }
  150. 150 r->next=NULL;
  151. 151 return L;
  152. 152 }
  153. 153 //按元素序号查找
  154. 154 void Get1(LinkList L, int i)
  155. 155 { //假设开始的情况是:
  156. 156 Node *p;
  157. 157 int j=0;
  158. 158 p=L;
  159. 159 while((p->next!=NULL)&&(j<i))
  160. 160 {
  161. 161 p=p->next;
  162. 162 j++;
  163. 163 }
  164. 164 // p->next是NULL
  165. 165 if(i==j)
  166. 166 {
  167. 167 printf("%d:%c\n", i,p->data);
  168. 168 }
  169. 169 else //不满足判断条件,因此执行else部分
  170. 170 printf("未找到");
  171. 171 }
  172. 172
  173. 173 //按元素值查找
  174. 174 void Locate1(LinkList L,char key)
  175. 175 {
  176. 176 int i = 1;
  177. 177 Node *p;
  178. 178 p=L->next;
  179. 179 while(p !=NULL)
  180. 180 {
  181. 181 if(p->data != key)
  182. 182 {
  183. 183 i++;
  184. 184 p=p->next;
  185. 185 }
  186. 186 else
  187. 187 {
  188. 188 printf("%c:%d\n", key, i);
  189. 189 break;
  190. 190 }
  191. 191 }
  192. 192 }
  193. 193
  194. 194
  195. 195 //按元素序号查找
  196. 196 Node *Get2(LinkList L, int i)
  197. 197 { //假设开始的情况是:
  198. 198 Node *p;
  199. 199 int j=0;
  200. 200 p=L;
  201. 201 while((p->next!=NULL)&&(j<i))
  202. 202 { //满足条件,因此进入循环体执行
  203. 203 p=p->next;
  204. 204 j++;
  205. 205 }
  206. 206 // p->next是NULL,不满足条件,因此不再执行循环体
  207. 207 if(i==j)
  208. 208 {
  209. 209 printf("%d:%c\n", i,p->data);
  210. 210 return p;
  211. 211 }
  212. 212 else //不满足判断条件,因此执行else部分
  213. 213 return NULL;
  214. 214 }
  215. 215
  216. 216 //按元素值查找
  217. 217 Node *Locate2(LinkList L,char key)
  218. 218 {
  219. 219 int i = 1;
  220. 220 Node *p;
  221. 221 p=L->next;
  222. 222 while(p !=NULL)
  223. 223 {
  224. 224 if(p->data != key)
  225. 225 {
  226. 226 i++;
  227. 227 p=p->next;
  228. 228 }
  229. 229 else
  230. 230 {
  231. 231 printf("%c:%d\n", key, i);
  232. 232 break;
  233. 233 }
  234. 234 }
  235. 235 return p;
  236. 236 }
  237. 237
  238. 238 //删除结点
  239. 239 void DelList(LinkList L,int i,char *e)
  240. 240 {
  241. 241 Node *p,*r;
  242. 242 int k =0;
  243. 243 p=L;
  244. 244 while(p->next != NULL && k < i-1)
  245. 245 {
  246. 246 p=p->next;
  247. 247 k=k+1;
  248. 248 }
  249. 249 if(k!=i-1)
  250. 250 {
  251. 251 printf("无此节点");
  252. 252 }
  253. 253 else
  254. 254 {
  255. 255 r=p->next;
  256. 256 p->next=p->next->next;
  257. 257 *e=r->data;//通过变量e返回删掉的元素值
  258. 258 free(r); //r这个变量及值都没有变动,但是不能再使用r指向的那个空间(因为已经释放)。
  259. 259 }
  260. 260 }
  261. 261 //插入结点
  262. 262 void InsList(LinkList L,int i,char e)
  263. 263 {
  264. 264 Node *pre,*s;
  265. 265 int k=0;
  266. 266 pre=L;
  267. 267 while(pre!=NULL&&k<i-1) /*先找到第i-1个数据元素的存储位置,使指针pre指向它*/
  268. 268 {
  269. 269 pre=pre->next;
  270. 270 k=k+1;
  271. 271 }
  272. 272 if(k!=i-1)
  273. 273 {
  274. 274 printf("插入位置不合理!");
  275. 275 return;
  276. 276 }
  277. 277 s=(Node*)malloc(sizeof(Node));/*为e申请一个新的结点*/
  278. 278 s->data=e; /*将待插入结点的值e赋给s的数据域*/
  279. 279 s->next=pre->next;
  280. 280 pre->next=s;
  281. 281 }
  282. 282
  283. 283
  284. 284
  285. 285 //求长度
  286. 286 int ListLength(LinkList L) /*L为带头结点的链表*/
  287. 287 {
  288. 288 Node *p;
  289. 289 int j=0; /*用来存放链表的长度*/
  290. 290 p=L->next;
  291. 291 while(p!=NULL)
  292. 292 {
  293. 293 p=p->next;
  294. 294 j++;
  295. 295 }
  296. 296 return j;
  297. 297 }
  298. 298
  299. 299
  300. 300 //合并
  301. 301 LinkList Merge(LinkList LA, LinkList LB)
  302. 302 {
  303. 303 LinkList p;
  304. 304 p = LA->next;
  305. 305 while(p->next)
  306. 306 p = p->next;
  307. 307 p->next = LB->next;
  308. 308 free(LB);
  309. 309 return LA;
  310. 310 }
  311. 311 //两个从小到大有序链表合并成为有序链表 LC
  312. 312 LinkList MergeLinkList(LinkList LA, LinkList LB)
  313. 313 {
  314. 314 Node *pa,*pb;
  315. 315 LinkList LC;
  316. 316 LinkList r;
  317. 317
  318. 318 pa=LA->next;
  319. 319 pb=LB->next;
  320. 320 LC=LA;
  321. 321 LC->next=NULL;
  322. 322 r=LC;
  323. 323
  324. 324 while(pa!=NULL && pb!=NULL)
  325. 325 {
  326. 326 if(pa->data <= pb->data)
  327. 327 {
  328. 328 r->next=pa;
  329. 329 r=pa;
  330. 330 pa=pa->next;
  331. 331 }
  332. 332 else
  333. 333 {
  334. 334 r->next=pb;
  335. 335 r=pb;
  336. 336 pb=pb->next;
  337. 337 }
  338. 338 }
  339. 339 if(pa != NULL)
  340. 340 r->next=pa;
  341. 341 //return NULL;
  342. 342 else//
  343. 343 r->next=pb;
  344. 344 free(LB);
  345. 345 return (LC);
  346. 346 }
  347. 347 /*
  348. 348 bcd$
  349. 349 新链表q:aef$
  350. 350 合并后全部元素为:abcdef
  351. 351 bc$
  352. 352 新链表q:adef$
  353. 353 合并后全部元素为:abcdef
  354. 354 acdg$
  355. 355 新链表q:be$
  356. 356 合并后全部元素为:abcdeg
  357. 357 */
  358. 358 //排序
  359. 359 void sore(LinkList head)
  360. 360 {
  361. 361 LinkList pre,cur,next,end, temp;
  362. 362 end = NULL;
  363. 363 while(head->next != end)
  364. 364 {
  365. 365 //初始化三个指针 ; 判断是否到达结束位置 ; 三个指针集体后移
  366. 366 for(pre=head,cur=pre->next,next=cur->next; next!=end; pre=pre->next,cur=cur->next,next=next->next)
  367. 367 {
  368. 368 if(cur->data > next->data) //从小到大
  369. 369 {
  370. 370 pre->next=next;
  371. 371 cur->next=next->next;
  372. 372 next->next=cur;
  373. 373 //此时next变前一项,cur变后一项 交换next cur
  374. 374 temp=cur;
  375. 375 cur=next;
  376. 376 next=temp;
  377. 377 }
  378. 378 }
  379. 379 //一轮循环结束 最后一项已经排好 end提前一项 (冒泡原理)
  380. 380 end = cur;
  381. 381 }
  382. 382 }
  383. 383
  384. 384 void printList(LinkList L)
  385. 385 {
  386. 386 Node *p = L;
  387. 387 while(p->next)
  388. 388 {
  389. 389 p = p->next;
  390. 390 if(p->data >= 'a' || p->data <='z')
  391. 391 printf("%c", p->data);
  392. 392 //printf(" ", p->data);
  393. 393 }
  394. 394 }

 

原文链接:http://www.cnblogs.com/yvtingwang/p/14194151.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号