当前位置:   article > 正文

第四周——项目三—单链表应用_单链表在项目中的应用

单链表在项目中的应用
  1. /*
  2. * Copyright (c) 2017,烟台大学计算机学院
  3. * All right reserved.
  4. * 文件名称:main.cpp
  5. * 作者:尹娜
  6. * 完成日期:2017年9月24日
  7. * 版本号:v1.0
  8. *
  9. * 问题描述:单链表的逆置、连接与递增判断
  10. * 输入描述:标准函数输入
  11. * 程序输出:标准函数输出
  12. */

(程序中利用了已经实现的单链表算法,头文件LinkList.h及其中函数的实现见单链表算法库

1.将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。

代码如下:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include "linklist.h"
  4. void Reverse(LinkList *&L)
  5. {
  6. LinkList *p=L->next,*q;
  7. L->next=NULL;
  8. while (p!=NULL) //扫描所有的结点
  9. {
  10. q=p->next; //让q指向*p结点的下一个结点
  11. p->next=L->next; //总是将*p结点作为第一个数据结点
  12. L->next=p;
  13. p=q; //让p指向下一个结点
  14. }
  15. }
  16. int main()
  17. {
  18. LinkList *L;
  19. ElemType a[]= {1,3,5,7, 2,4,8,10};
  20. CreateListR(L,a,8);
  21. printf("L:");
  22. DispList(L);
  23. Reverse(L);
  24. printf("逆置后L: ");
  25. DispList(L);
  26. DestroyList(L);
  27. return 0;
  28. }
运行结果:

2.已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m、n,将L2连接到L1的后面。

代码如下:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include "linklist.h"
  4. void Link(LinkList *&L1, LinkList *&L2)
  5. {
  6. LinkList *p = L1;
  7. while(p->next != NULL) //找到L1的尾节点
  8. p = p->next;
  9. p->next = L2->next; //将L2的首个数据节点连接到L1的尾节点后
  10. free(L2); //释放掉已经无用的L2的头节点
  11. }
  12. int main()
  13. {
  14. LinkList *A, *B;
  15. int i;
  16. ElemType a[]= {1,3,2,9};
  17. ElemType b[]= {0,4,7,6,5,8};
  18. InitList(A);
  19. for(i=3; i>=0; i--)
  20. ListInsert(A, 1, a[i]);
  21. InitList(B);
  22. for(i=5; i>=0; i--)
  23. ListInsert(B, 1, b[i]);
  24. Link(A, B);
  25. printf("A:");
  26. DispList(A);
  27. DestroyList(A);
  28. return 0;
  29. }
运行结果:


3.判断单链表L是否是递增的。

代码如下:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include "linklist.h"
  4. bool increase(LinkList *L)
  5. {
  6. LinkList *p = L->next, *q; //p指向第1个数据节点
  7. if(p != NULL)
  8. {
  9. while(p->next != NULL)
  10. {
  11. q = p->next; //q是p的后继
  12. if (q->data > p->data) //只要是递增的,就继续考察其后继
  13. p = q;
  14. else
  15. return false; //只要有一个不是后继大于前驱,便不是递增
  16. }
  17. }
  18. return true;
  19. }
  20. int main()
  21. {
  22. LinkList *A, *B;
  23. int i;
  24. ElemType a[]= {1, 3, 2, 9};
  25. ElemType b[]= {0, 4, 5 ,6, 7, 8};
  26. InitList(A);
  27. for(i=3; i>=0; i--)
  28. ListInsert(A, 1, a[i]);
  29. InitList(B);
  30. for(i=5; i>=0; i--)
  31. ListInsert(B, 1, b[i]);
  32. printf("A: %c\n", increase(A)?'Y':'N');
  33. printf("B: %c\n", increase(B)?'Y':'N');
  34. DestroyList(A);
  35. DestroyList(B);
  36. return 0;
  37. }
运行结果:



知识总结:应用到之前写的算法库,利用一些基本算法,实现一些单链表的简单应用。

学习心得:起初对这些应用的实现很懵,可是通过画图,也是可以理解的。对于链表的理解,重要的还是画图。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/609289
推荐阅读
相关标签
  

闽ICP备14008679号