当前位置:   article > 正文

双向链表的操作(C语言)

双向链表的操作(C语言)

main函数部分:

  1. #include <stdio.h>
  2. #include "./23_doubleLinkList.h"
  3. int main(int argc, const char *argv[])
  4. {
  5. doubleLinkList* head = create_doubleLinkList();
  6. insertHead_doubleLinkList(head,12);
  7. insertHead_doubleLinkList(head,21);
  8. insertHead_doubleLinkList(head,14);
  9. insertHead_doubleLinkList(head,16);
  10. insertTail_doubleLinkList(head,13);
  11. show_doubleLinkList(head);
  12. insertBypos_doubleLinkList(head,33,6);
  13. show_doubleLinkList(head);
  14. deleteHead_doubleLinkList(head);
  15. show_doubleLinkList(head);
  16. deleteTail_doubleLinkList(head);
  17. show_doubleLinkList(head);
  18. deleteBypos_doubleLinkList(head,2);
  19. show_doubleLinkList(head);
  20. return 0;
  21. }

功能函数:

  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. #include "./23_doubleLinkList.h"
  4. doubleLinkList* create_doubleLinkList()
  5. {
  6. doubleLinkList* head = (doubleLinkList*)malloc(sizeof(doubleLinkList));
  7. if(NULL==head)
  8. {
  9. printf("头结点创建失败!\n");
  10. return NULL;
  11. }
  12. head->text.len=0;
  13. head->next=head->prev=NULL;
  14. return head;
  15. }
  16. //判断链表是否为空
  17. int isEmpty(doubleLinkList* head)
  18. {
  19. return head->next==NULL?1:0;
  20. }
  21. //头插
  22. void insertHead_doubleLinkList(doubleLinkList* head,datatype num)
  23. {
  24. doubleLinkList* temp=(doubleLinkList*)malloc(sizeof(doubleLinkList));
  25. if(NULL == temp)
  26. {
  27. printf("头结点创建失败!\n");
  28. return;
  29. }
  30. temp->text.data=num;
  31. temp->next=temp->prev=NULL;
  32. //插入操作
  33. //需分情况考虑该链表是否有元素,以免出现段错误
  34. if(head->next!=NULL)
  35. {
  36. temp->next = head->next;
  37. head->next=temp;
  38. temp->prev=head;
  39. temp->next->prev=temp;
  40. }else
  41. {
  42. temp->next = head->next;
  43. head->next=temp;
  44. temp->prev=head;
  45. }
  46. head->text.len++;
  47. return;
  48. }
  49. //尾插
  50. void insertTail_doubleLinkList(doubleLinkList* head,datatype num)
  51. {
  52. //定义一个新的结点
  53. doubleLinkList* temp=(doubleLinkList*)malloc(sizeof(doubleLinkList));
  54. if(NULL == temp)
  55. {
  56. printf("头结点创建失败!\n");
  57. return;
  58. }
  59. temp->text.data=num;
  60. temp->next=temp->prev=NULL;
  61. //找到尾部的结点,p就是原双向链表的尾部结点
  62. doubleLinkList* p=head;
  63. while(p->next!=NULL)
  64. {
  65. p=p->next;
  66. }
  67. p->next=temp;
  68. temp->next=NULL;
  69. temp->prev=p;
  70. head->text.len++;
  71. return;
  72. }
  73. //按位置插入
  74. void insertBypos_doubleLinkList(doubleLinkList* head,datatype num,int pos)
  75. {
  76. if(pos<1 || pos>head->text.len+1)
  77. {
  78. printf("输入的位置%d不合法!\n",pos);
  79. }
  80. //定义一个新的结点
  81. doubleLinkList* temp=(doubleLinkList*)malloc(sizeof(doubleLinkList));
  82. if(NULL == temp)
  83. {
  84. printf("头结点创建失败!\n");
  85. return;
  86. }
  87. temp->text.data=num;
  88. temp->next=temp->prev=NULL;
  89. //找到要插入位置的前一个`结点
  90. doubleLinkList* p=head;
  91. int i;
  92. for(i=0;i<pos-1;i++)
  93. {
  94. p=p->next;
  95. }
  96. temp->next=p->next;
  97. p->next=temp;
  98. temp->prev=p;
  99. if(temp->next!=NULL)
  100. temp->next->prev=temp;
  101. head->text.len++;
  102. return;
  103. }
  104. //头删
  105. void deleteHead_doubleLinkList(doubleLinkList* head)
  106. {
  107. if(head->next==NULL)
  108. {
  109. printf("链表为空!\n");
  110. return;
  111. }
  112. //定义一个指针指向要删除的结点方便后续释放
  113. doubleLinkList* temp;
  114. temp=head->next;
  115. head->next=temp->next;
  116. //需分情况考虑该结点是否为链表最后一个结点,以免出现段错误
  117. if(temp->next!=NULL)
  118. {
  119. temp->next->prev=head;
  120. }
  121. free(temp);
  122. head->text.len--;
  123. return;
  124. }
  125. //尾删
  126. void deleteTail_doubleLinkList(doubleLinkList* head)
  127. {
  128. if(head->next==NULL)
  129. {
  130. printf("链表为空!\n");
  131. return;
  132. }
  133. //定义一个指针指向要删除的结点方便后续释放
  134. doubleLinkList* p=head;
  135. while(p->next!=NULL)
  136. {
  137. p=p->next;
  138. }
  139. p->prev->next=NULL;
  140. free(p);
  141. head->text.len--;
  142. return;
  143. }
  144. //按位置删除
  145. void deleteBypos_doubleLinkList(doubleLinkList* head,int pos)
  146. {
  147. if(head->next==NULL)
  148. {
  149. printf("链表为空!\n");
  150. return;
  151. }
  152. //判断位置是否合法
  153. if(pos<1 || pos>head->text.len)
  154. {
  155. printf("输入的位置%d不合法!\n",pos);
  156. }
  157. //定义一个指针指向要删除的结点方便后续释放
  158. doubleLinkList* p=head;
  159. int i;
  160. for(i=0;i<pos;i++)
  161. {
  162. p=p->next;
  163. }
  164. //p就是要删除的结点
  165. p->prev->next=p->next;
  166. //当结点不为最后一个节点时,需要将该结点的后一位的前驱指针指向上一个结点
  167. //当结点为最后一个节点则不需要,若不分情况考虑则会出现段错误;
  168. if(p->next!=NULL)
  169. {
  170. p->next->prev=p->prev;
  171. }
  172. free(p);
  173. head->text.len--;
  174. }
  175. //遍历
  176. void show_doubleLinkList(doubleLinkList* head)
  177. {
  178. doubleLinkList* p=head;
  179. if(isEmpty(head))
  180. {
  181. printf("链表为空!\n");
  182. }
  183. while(p->next!=NULL)
  184. {
  185. p=p->next;
  186. printf("%d ",p->text.data);
  187. }
  188. printf("\n");
  189. return;
  190. }

头文件:

  1. #ifndef __doubleLinkList_H__
  2. #define __doubleLinkList_H__
  3. typedef int datatype;
  4. union msg{ //若数据的类型也为int,则不需要这个联合体
  5. datatype data;
  6. int len; //放头结点,记录链表长度
  7. };
  8. typedef struct node{
  9. union msg text;
  10. struct node* next; //指针,由于指针指向这一整个节点,所以类型为struct node*
  11. struct node* prev;
  12. }doubleLinkList;
  13. doubleLinkList* create_doubleLinkList();
  14. void insertHead_doubleLinkList(doubleLinkList* head,datatype num);
  15. void insertTail_doubleLinkList(doubleLinkList* head,datatype num);
  16. void deleteBypos_doubleLinkList(doubleLinkList* head,int pos);
  17. void deleteTail_doubleLinkList(doubleLinkList* head);
  18. void deleteHead_doubleLinkList(doubleLinkList* head);
  19. void insertBypos_doubleLinkList(doubleLinkList* head,datatype num,int pos);
  20. void show_doubleLinkList(doubleLinkList* head);
  21. #endif

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

闽ICP备14008679号