当前位置:   article > 正文

c语言 数据结构 双向循环链表逆序_双向循环链表逆序算法

双向循环链表逆序算法

双链循环链表排序

原链表: 1 2 3 4 5 6 7 8 9 10

逆序后:10 9 8 7 6 5 4 3 2 1 

思路: 

        把最后一个节点删除, 插到head下面去

         数据 1 不用管, 把后面的数据往 1 前面怼, 1自然就是最后一个了

提示:需要一个指针记录一下最后一个值 p 的位置;(看自身代码情况);

思路图如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define SIZE 10
  4. typedef struct lint
  5. {
  6. int data;
  7. struct lint *prev;
  8. struct lint *next;
  9. } lint, *plist;
  10. void stamp(plist head);
  11. //创建头节点
  12. plist LOCK(void)
  13. {
  14. plist head = malloc(sizeof(lint));
  15. if (head == NULL)
  16. {
  17. printf("head errer\n");
  18. return NULL;
  19. }
  20. head->data = 0;
  21. head->prev = head;
  22. head->next = head;
  23. return head;
  24. }
  25. // 创建新节点
  26. plist Her_a(int data)
  27. {
  28. plist new = malloc(sizeof(lint));
  29. if (new == NULL)
  30. {
  31. printf("new erreo\n");
  32. return NULL;
  33. }
  34. new->data = data;
  35. new->prev = NULL;
  36. new->next = NULL;
  37. }
  38. // 尾部插入
  39. int Wak_a(plist head, int data)
  40. {
  41. plist newnode = Her_a(data);
  42. plist p = head;
  43. while (p->next != head)
  44. {
  45. p = p->next;
  46. }
  47. p->next = newnode;
  48. newnode->prev = p;
  49. newnode->next = head;
  50. head->prev = newnode;
  51. return 0;
  52. }
  53. //循环插入
  54. void cha(plist head)
  55. {
  56. for (int i = 1; i <= SIZE; i++)
  57. {
  58. Wak_a(head, i);
  59. }
  60. }
  61. // 打印
  62. void stamp(plist head)
  63. {
  64. plist p = head->next;
  65. printf("-head");
  66. while (p != head)
  67. {
  68. printf("-%d", p->data);
  69. p = p->next;
  70. }
  71. printf("\n");
  72. }
  73. //删除最后一个节点
  74. void mak_a(plist p)
  75. {
  76. p->prev->next = p->next;
  77. p->next->prev = p->prev;
  78. p->next = p->prev = NULL;
  79. }
  80. // 头插
  81. void mak_b(plist p, plist head)
  82. {
  83. p->next = head->next;
  84. head->next = p;
  85. p->next->prev = p;
  86. p->prev = head;
  87. }
  88. // 交换数据
  89. int Her_b(plist head)
  90. {
  91. if(head->next == head)
  92. {
  93. printf("此节点没有数据\n");
  94. return -1;
  95. }
  96. plist p = head->next;
  97. plist q = NULL;
  98. while(p != head)
  99. {
  100. // q 负责记录 P 原先的位置 1 位置不用变, 直接往前怼就完事了
  101. q = p->next;
  102. mak_a(p);//删除结点
  103. mak_b(p, head);//交换节点
  104. p = q;
  105. }
  106. }
  107. int main(int argc, char const *argv[])
  108. {
  109. plist myhead = LOCK();
  110. cha(myhead);//循环尾部插入数据
  111. stamp(myhead);//打印
  112. Her_b(myhead);//交换数据
  113. stamp(myhead);//打印
  114. return 0;
  115. }

执行完毕图:

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号