当前位置:   article > 正文

数据结构双向链表,实现增删改查_编写一个双向链表,实现链表的创建、删除、新增、修改、查找操作管理

编写一个双向链表,实现链表的创建、删除、新增、修改、查找操作管理

一、双向链表的描述

        在单链表中,查找直接后继结点的执行时间为O(1),而查找直接前驱的执行时间为O(n)。为克服单链表这种单向性的缺点,可以用双向链表

        在双向链表的结点中有两个指针域,一个指向直接后继,另一个指向直接前驱。

二、双向链表的存储结构

  1. typedef char ElemType[20]; //重定义数据域的数据类型
  2. typedef struct LNode //定义双向链表存储结构
  3. {
  4. ElemType data;
  5. struct LNode *next;
  6. struct LNode *prev;
  7. }*DoubleLink;

三、双向链表的操作

2.1 双向链表结点创建

  1. DoubleLink Request_space() //在堆区申请一个结点空间
  2. {
  3. DoubleLink node=(DoubleLink)malloc(sizeof(struct LNode));
  4. if(NULL==node)
  5. return NULL;
  6. strcpy(node->data,"");
  7. node->next=node->prev=NULL;
  8. return node;
  9. }

2.2 双向链表遍历

  1. int Output(DoubleLink L_list) //实现输出
  2. {
  3. if(NULL==L_list)
  4. return -1;
  5. DoubleLink p=L_list;
  6. do
  7. {
  8. printf("%s ",p->data);
  9. p=p->next;
  10. }while(p!=NULL);
  11. puts("");
  12. return 0;
  13. }

2.3 双向链表头插

  1. DoubleLink insert_head(DoubleLink L_list,ElemType value) //实现头插
  2. {
  3. DoubleLink node=Request_space();
  4. if(NULL==node)
  5. return L_list;
  6. strcpy(node->data,value);
  7. if(NULL!=L_list)
  8. {
  9. node->next=L_list;
  10. L_list->prev=node;
  11. }
  12. L_list=node;
  13. return L_list;
  14. }

2.4 双向链表尾插

  1. DoubleLink insert_rear(DoubleLink L_list,ElemType value) //实现尾插
  2. {
  3. DoubleLink node=Request_space();
  4. strcpy(node->data,value);
  5. if(NULL==L_list)
  6. L_list=node;
  7. else
  8. {
  9. DoubleLink rear=L_list;
  10. while(rear->next!=NULL)
  11. rear=rear->next;
  12. rear->next=node;
  13. node->prev=rear;
  14. }
  15. return L_list;
  16. }

2.5 双向链表头删

  1. DoubleLink delete_head(DoubleLink L_list) //实现头删
  2. {
  3. if(NULL==L_list)
  4. return NULL;
  5. if(L_list->next==NULL)
  6. {
  7. free(L_list);
  8. L_list=NULL;
  9. }
  10. else
  11. {
  12. DoubleLink p=L_list->next;
  13. strcpy(L_list->data,p->data);
  14. L_list->next=p->next;
  15. if(p->next!=NULL)
  16. p->next->prev=L_list;
  17. free(p);
  18. p=NULL;
  19. }
  20. return L_list;
  21. }

2.6 双向链表尾删

  1. DoubleLink delete_rear(DoubleLink L_list) //实现尾删
  2. {
  3. if(NULL==L_list)
  4. return NULL;
  5. if(L_list->next==NULL)
  6. {
  7. free(L_list);
  8. L_list=NULL;
  9. }
  10. else
  11. {
  12. DoubleLink rear=L_list;
  13. while(rear->next!=NULL)
  14. rear=rear->next;
  15. rear->prev->next=NULL;
  16. free(rear);
  17. rear=NULL;
  18. }
  19. return L_list;
  20. }

2.7 计算双向链表长度

  1. int len_Llist(DoubleLink L_list) //计算双向链表长度
  2. {
  3. int count=0;
  4. if(NULL==L_list)
  5. return -1;
  6. while(L_list!=NULL)
  7. {
  8. count++;
  9. L_list=L_list->next;
  10. }
  11. return count;
  12. }

2.8 双向链表逆置

  1. DoubleLink rev_list(DoubleLink L_list) //双向链表逆置
  2. {
  3. if(NULL==L_list||L_list->next==NULL)
  4. return L_list;
  5. int len=len_Llist(L_list)-1;
  6. DoubleLink p=L_list->next;
  7. L_list->next=NULL;
  8. L_list->prev=L_list->next;
  9. for(int i=0;i<len;i++)
  10. {
  11. DoubleLink q=p;
  12. p=p->next;
  13. q->prev=q->next;
  14. q->next=L_list;
  15. L_list=q;
  16. }
  17. return L_list;
  18. }

四、多文件编辑实现双向链表操作

头文件 head.h

  1. #ifndef __HEAD_H__
  2. #define __HEAD_H__
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. typedef char ElemType[20]; //重定义数据域的数据类型
  7. typedef struct LNode //定义双向链表存储结构
  8. {
  9. ElemType data;
  10. struct LNode *next;
  11. struct LNode *prev;
  12. }*DoubleLink;
  13. DoubleLink Request_space(); //在堆区申请一个结点空间
  14. int Output(DoubleLink L_list); //实现输出
  15. DoubleLink insert_head(DoubleLink L_list,ElemType value); //实现头插
  16. DoubleLink insert_rear(DoubleLink L_list,ElemType value); //实现尾插
  17. DoubleLink delete_head(DoubleLink L_list); //实现头删
  18. DoubleLink delete_rear(DoubleLink L_list); //实现尾删
  19. DoubleLink rev_list(DoubleLink L_list); //双向链表逆置
  20. #endif

自定义函数 fun.c

  1. #include "head.h"
  2. DoubleLink Request_space() //在堆区申请一个结点空间
  3. {
  4. DoubleLink node=(DoubleLink)malloc(sizeof(struct LNode));
  5. if(NULL==node)
  6. return NULL;
  7. strcpy(node->data,"");
  8. node->next=node->prev=NULL;
  9. return node;
  10. }
  11. int Output(DoubleLink L_list) //实现输出
  12. {
  13. if(NULL==L_list)
  14. return -1;
  15. DoubleLink p=L_list;
  16. do
  17. {
  18. printf("%s ",p->data);
  19. p=p->next;
  20. }while(p!=NULL);
  21. puts("");
  22. return 0;
  23. }
  24. DoubleLink insert_head(DoubleLink L_list,ElemType value) //实现头插
  25. {
  26. DoubleLink node=Request_space();
  27. if(NULL==node)
  28. return L_list;
  29. strcpy(node->data,value);
  30. if(NULL!=L_list)
  31. {
  32. node->next=L_list;
  33. L_list->prev=node;
  34. }
  35. L_list=node;
  36. return L_list;
  37. }
  38. DoubleLink insert_rear(DoubleLink L_list,ElemType value) //实现尾插
  39. {
  40. DoubleLink node=Request_space();
  41. strcpy(node->data,value);
  42. if(NULL==L_list)
  43. L_list=node;
  44. else
  45. {
  46. DoubleLink rear=L_list;
  47. while(rear->next!=NULL)
  48. rear=rear->next;
  49. rear->next=node;
  50. node->prev=rear;
  51. }
  52. return L_list;
  53. }
  54. DoubleLink delete_head(DoubleLink L_list) //实现头删
  55. {
  56. if(NULL==L_list)
  57. return NULL;
  58. if(L_list->next==NULL)
  59. {
  60. free(L_list);
  61. L_list=NULL;
  62. }
  63. else
  64. {
  65. DoubleLink p=L_list->next;
  66. strcpy(L_list->data,p->data);
  67. L_list->next=p->next;
  68. if(p->next!=NULL)
  69. p->next->prev=L_list;
  70. free(p);
  71. p=NULL;
  72. }
  73. return L_list;
  74. }
  75. DoubleLink delete_rear(DoubleLink L_list) //实现尾删
  76. {
  77. if(NULL==L_list)
  78. return NULL;
  79. if(L_list->next==NULL)
  80. {
  81. free(L_list);
  82. L_list=NULL;
  83. }
  84. else
  85. {
  86. DoubleLink rear=L_list;
  87. while(rear->next!=NULL)
  88. rear=rear->next;
  89. rear->prev->next=NULL;
  90. free(rear);
  91. rear=NULL;
  92. }
  93. return L_list;
  94. }
  95. int len_Llist(DoubleLink L_list) //计算双向链表长度
  96. {
  97. int count=0;
  98. if(NULL==L_list)
  99. return -1;
  100. while(L_list!=NULL)
  101. {
  102. count++;
  103. L_list=L_list->next;
  104. }
  105. return count;
  106. }
  107. DoubleLink rev_list(DoubleLink L_list) //双向链表逆置
  108. {
  109. if(NULL==L_list||L_list->next==NULL)
  110. return L_list;
  111. int len=len_Llist(L_list)-1;
  112. DoubleLink p=L_list->next;
  113. L_list->next=NULL;
  114. for(int i=0;i<len;i++)
  115. {
  116. DoubleLink q=p;
  117. p=p->next;
  118. q->prev=q->next;
  119. q->next=L_list;
  120. L_list=q;
  121. }
  122. return L_list;
  123. }

主函数 main.c

  1. #include "head.h"
  2. int main(int argc, const char *argv[])
  3. {
  4. DoubleLink L_list=NULL; //定义头指针变量,注意定义时一定要指向NULL
  5. int n; //定义循环输入次数
  6. ElemType value; //定义数据域元素
  7. int seat; //定义元素位置
  8. printf("please enter n:");
  9. scanf("%d",&n);
  10. for(int i=0;i<n;i++) //头插
  11. {
  12. printf("please enter a value:");
  13. scanf("%s",value);
  14. L_list=insert_head(L_list,value);
  15. }
  16. for(int i=0;i<n;i++) //尾插
  17. {
  18. printf("please enter a value:");
  19. scanf("%s",value);
  20. L_list=insert_rear(L_list,value);
  21. }
  22. L_list=delete_head(L_list); //头删
  23. L_list=delete_rear(L_list); //尾删
  24. Output(L_list);
  25. L_list=rev_list(L_list); //双向链表逆置
  26. Output(L_list);
  27. return 0;
  28. }

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

闽ICP备14008679号