当前位置:   article > 正文

对称循环双链表的判定(C语言实现)_数据结构c语言判断链表对称

数据结构c语言判断链表对称

设计一个算法用于判断带头结点的循环双向链表是否对称。

(1) 首先创建一个循环双向链表,输入到“-1”时,退出循环,链表创建完成。

(2) 设计一个符合上述要求的函数:让p从左向右扫描,q从右向左扫描,直到它们指向同一结点(结点为奇数个)或相邻(结点为偶数个)为止。若它们所指结点值相同,则继续进行下去,否则返回0。若比较全部相等,则返回1。

(3) 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct DNode {
  4. int data;
  5. struct DNode *next, *prior;
  6. } DNode, *DinkList;
  7. /*
  8. TODO:创建循环双向链表
  9. 功能:创建循环双向链表,从键盘录入链表元素,输入-1 回车停止输入
  10. 比如录入1 2 3 4 5 6 -1,链表值为:1 2 3 4 5 6
  11. 参数:DinkList L是需要操作的链表
  12. 返回值: 返回值为创建成功的链表
  13. */
  14. DinkList Createlist(DinkList L) {
  15. DinkList e=NULL;
  16. DinkList p=NULL;
  17. DinkList q=NULL;
  18. p=(DinkList) malloc(sizeof(DNode));
  19. L->data=-1;
  20. L->next=NULL;
  21. L->prior=NULL;
  22. L->next=p;
  23. p->prior=L;
  24. q=p;
  25. scanf("%d",&p->data);
  26. while(p->data!=-1)
  27. {
  28. p=(DinkList) malloc(sizeof(DNode));
  29. scanf("%d",&p->data);
  30. q->next=p;
  31. p->prior=q;
  32. q=p;
  33. }
  34. e=(DinkList) malloc(sizeof(DNode));
  35. q->next=e;
  36. e->data=-1;
  37. e->prior=q;
  38. e->next=L;
  39. L->prior=e;
  40. return L;
  41. }
  42. /*
  43. TODO:输出循环双向链表
  44. 功能:输出循环双向链表,每个元素之间用" ->" 隔开,
  45. 比如,链表元素:1 2 3 4 5 6
  46. 则输出为:1 ->2 ->3 ->4 ->5 ->6
  47. 参数:DinkList L是需要操作的链表
  48. 返回值: 无
  49. */
  50. void ViewLinklist(DinkList L) {
  51. DinkList h=NULL;
  52. h=L->next;
  53. printf("%d",h->data);
  54. h=h->next;
  55. while(h->data!=-1)
  56. {
  57. printf(" ->%d",h->data);
  58. h=h->next;
  59. }
  60. }
  61. /*
  62. TODO:查看是否对称
  63. 功能:让p从左向右扫描,q从右向左扫描,直到它们指向同一结点(结点为奇数个)或相邻(结点为偶数个)为止。
  64. 若它们所指结点值相同,则继续进行下去,否则返回0。若比较全部相等,则返回1
  65. 如:链表元素:1 2 3 4 5 4 3 2 1,则对称
  66. 链表元素:1 2 3 4 5 5 4 3 2 1,则对称
  67. 链表元素:1 2 3 4 5 1 2 3 4 5,则不对称
  68. 参数:DinkList L是需要操作的链表
  69. 返回值: 返回1 双向链表对称,返回0双向链表不对称
  70. */
  71. int Symmetry(DinkList L) {
  72. DinkList p=NULL,q=NULL,h=NULL,e=NULL;
  73. p=q=L->next;
  74. while(q->data!=-1)
  75. {
  76. q=q->next;
  77. }
  78. q=q->prior;
  79. while(p->data==q->data&(p->data!=-1||q->data!=-1))
  80. {
  81. p=p->next;
  82. q=q->prior;
  83. }
  84. if(p->data==-1&&q->data==-1)
  85. {
  86. return 1;
  87. }
  88. return 0;
  89. }
  90. int menu_select() //菜单驱动程序
  91. {
  92. int sn;
  93. printf("实验一运行系统\n"); //显示菜单
  94. printf("==============================\n");
  95. printf("1、建立循环双向链表\n");
  96. printf("2、循环双向链表元素输出\n");
  97. printf("3、判断是否对称\n");
  98. printf("0、退出实验\n");
  99. printf("==============================\n");
  100. printf("请选择0--3:");
  101. for (;;) //菜单功能选择
  102. {
  103. scanf("%d", &sn);
  104. getchar();
  105. if (sn < 0 || sn > 3)
  106. printf("\n输入选择错误,请重新选择 0--3:");
  107. else
  108. break;
  109. }
  110. return sn;
  111. }
  112. void main() {
  113. DinkList L = (DinkList) malloc(sizeof(DNode));
  114. for (;;) // 无限循环,选择0 退出
  115. {
  116. switch (menu_select()) // 调用菜单函数,按返回值选择功能函数
  117. {
  118. case 1:
  119. printf("请输入链表数据,录入-1停止:\n");
  120. Createlist(L);
  121. break;
  122. case 2:
  123. printf("循环双链表为:\n");
  124. ViewLinklist(L);
  125. break;
  126. case 3:
  127. if (Symmetry(L) == 1)
  128. printf("该循环单链表对称");
  129. else
  130. printf("该循环单链表不对称");
  131. break;
  132. case 0:
  133. printf("再见!\n"); //退出系统
  134. exit(0);
  135. } // switch语句结束
  136. } // for循环结束
  137. } // main()函数结束

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

闽ICP备14008679号