当前位置:   article > 正文

第四周项目三数据结构实践(一)——单链表:逆置_单链表的逆置实践总结

单链表的逆置实践总结
  1. /*
  2. * Copyright (c) 2015, 烟台大学计算机与控制工程学院
  3. * All rights reserved.
  4. * 文件名称: linklist.cpp,main.cpp,linklist.h
  5. * 作者:巩凯强
  6. * 完成日期:2015年9月22日
  7. * 版本号:vc++6.0
  8. *
  9. * 问题描述:设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据为 a1。实现这个算法,并完成测试。
  10. * 输入描述:无
  11. * 程序输出:逆置以后的结果。
  12. */
  13. #include <stdio.h>
  14. #include <malloc.h>
  15. typedef int ElemType;
  16. typedef struct LNode //定义单链表结点类型
  17. {
  18. ElemType data;
  19. struct LNode *next; //指向后继结点
  20. }LinkList;
  21. void CreateListR(LinkList *&L,ElemType a[],int n);
  22. void InitList(LinkList *&L); //初始化线性表
  23. void DestroyList(LinkList *&L); //销毁线性表
  24. bool ListEmpty(LinkList *L); //判断线性表是否为空
  25. void DispList(LinkList *L); //输出线性表
  26. bool ListInsert(LinkList *&L,int i,ElemType e); //插入数据元素
  27. void Reverse(LinkList *&L);
  1. #include "linklist.h"
  2. void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表
  3. {
  4. LinkList *s,*r;
  5. int i;
  6. L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点
  7. L->next=NULL;
  8. r=L; //r始终指向终端结点,开始时指向头结点
  9. for (i=0; i<n; i++)
  10. {
  11. s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
  12. s->data=a[i];
  13. r->next=s; //将*s插入*r之后
  14. r=s;
  15. }
  16. r->next=NULL; //终端结点next域置为NULL
  17. }
  18. void InitList(LinkList *&L)
  19. {
  20. L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点
  21. L->next=NULL;
  22. }
  23. void DestroyList(LinkList *&L)
  24. {
  25. LinkList *p=L,*q=p->next;
  26. while (q!=NULL)
  27. {
  28. free(p);
  29. p=q;
  30. q=p->next;
  31. }
  32. free(p); //此时q为NULL,p指向尾结点,释放它
  33. }
  34. bool ListEmpty(LinkList *L)
  35. {
  36. return(L->next==NULL);
  37. }
  38. void DispList(LinkList *L)
  39. {
  40. LinkList *p=L->next;
  41. while (p!=NULL)
  42. {
  43. printf("%d ",p->data);
  44. p=p->next;
  45. }
  46. printf("\n");
  47. }
  48. bool ListInsert(LinkList *&L,int i,ElemType e)
  49. {
  50. int j=0;
  51. LinkList *p=L,*s;
  52. while (j<i-1 && p!=NULL) //查找第i-1个结点
  53. {
  54. j++;
  55. p=p->next;
  56. }
  57. if (p==NULL) //未找到位序为i-1的结点
  58. return false;
  59. else //找到位序为i-1的结点*p
  60. {
  61. s=(LinkList *)malloc(sizeof(LinkList));//创建新结点*s
  62. s->data=e;
  63. s->next=p->next; //将*s插入到*p之后
  64. p->next=s;
  65. return true;
  66. }
  67. }
  68. void Reverse(LinkList *&L)
  69. {
  70. LinkList *p=L->next,*q;
  71. L->next=NULL;
  72. while (p!=NULL) //扫描所有的结点
  73. {
  74. q=p->next; //让q指向*p结点的下一个结点
  75. p->next=L->next; //总是将*p结点作为第一个数据结点
  76. L->next=p;
  77. p=q; //让p指向下一个结点
  78. }
  79. }
  1. #include "linklist.h"
  2. int main()
  3. {
  4. LinkList *L;
  5. ElemType a[]= {1,3,5,7, 2,4,8,10};
  6. CreateListR(L,a,8);
  7. printf("L:");
  8. DispList(L);
  9. Reverse(L);
  10. printf("逆置后L: ");
  11. DispList(L);
  12. DestroyList(L);
  13. return 0;
  14. }


运行结果:

知识点总结:

先采用右插法将数插入,调用Reverse()函数置换,主要代码为q=p->next; p->next=L->next; L->next=p; p=q;

学习心得:

又学会了逆置的算法,慢慢积累。

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

闽ICP备14008679号