C语言:循环双链表的创建,插入,删除

电玩女神 2022-08-03 11:51 312阅读 0赞
  1. /*
  2. 双向循环链表的创建,插入,删除
  3. */
  4. # include <stdio.h>
  5. # include <malloc.h>
  6. //节点类型
  7. typedef struct node
  8. {
  9. int data;
  10. struct node * pNext;
  11. struct node * pPrior;
  12. }NODE, *PNODE;
  13. PNODE creat_list(); //建立链表
  14. void traverse(PNODE pHead); //遍历链表
  15. void insert(PNODE pHead, int pos, int val); //在链表的第pos位置插入元素val
  16. int Length(PNODE pHead); //求链表的长度
  17. void getEle(PNODE pHead, int pos); //获取第pos位置的前驱、后继元素
  18. void dele(PNODE pHead, int pos); //删除第pos位置的元素
  19. int main(void)
  20. {
  21. PNODE pHead = creat_list(); //创建循环双链表
  22. traverse(pHead);
  23. //在第pos节点前插入新节点
  24. printf("在第1个节点前插入4:");
  25. insert(pHead, 1, 4);
  26. traverse(pHead);
  27. //获取pos位置的前驱、后继
  28. getEle(pHead, 2);
  29. getEle(pHead, 3);
  30. //删除第pos位置的元素
  31. printf("删除第4个节点:");
  32. dele(pHead, 4);
  33. traverse(pHead);
  34. return 0;
  35. }
  36. //创建循环双链表
  37. PNODE creat_list()
  38. {
  39. int len;
  40. int val;
  41. int i;
  42. PNODE pHead = (PNODE)malloc(sizeof(NODE)); //创建头结点
  43. pHead->pNext = pHead;
  44. pHead->pPrior = pHead;
  45. PNODE pTail = pHead;
  46. PNODE pNew;
  47. printf("链表节点个数为 len = ");
  48. scanf("%d", &len);
  49. for(i = 0; i < len; i++)
  50. {
  51. printf("输入第%d个节点的值:", i+1);
  52. scanf("%d", &val);
  53. pNew = (PNODE)malloc(sizeof(NODE));
  54. pNew->data = val;
  55. pNew->pPrior = pTail;
  56. pNew->pNext = pHead;
  57. pTail->pNext = pNew;
  58. pTail = pNew;
  59. }
  60. return pHead;
  61. }
  62. //遍历链表
  63. void traverse(PNODE pHead)
  64. {
  65. PNODE p = pHead->pNext;
  66. while(p != pHead)
  67. {
  68. printf("%d ", p->data);
  69. p = p->pNext;
  70. }
  71. printf("\n");
  72. }
  73. //在第pos位置前插入元素val
  74. void insert(PNODE pHead, int pos, int val)
  75. {
  76. PNODE p = pHead->pNext; //p指向首节点
  77. PNODE pNew = (PNODE)malloc(sizeof(NODE));
  78. pNew->data = val;
  79. int len = Length(pHead);
  80. int count = 0; //计数器
  81. if(1 == pos) //新节点插在首节点前
  82. {
  83. pNew->pNext = p;
  84. p->pPrior = pNew;
  85. pNew->pPrior = pHead;
  86. pHead->pNext = pNew;
  87. }
  88. //获取第pos-1个节点的指针p,新节点插在p后面
  89. else if(pos > 1 && pos <= len + 1)
  90. {
  91. while(p != pHead)
  92. {
  93. count ++;
  94. if(count == pos - 1)
  95. {
  96. pNew->pNext = p->pNext;
  97. p->pNext->pPrior = pNew;
  98. p->pNext = pNew;
  99. pNew->pPrior = p;
  100. break;
  101. }
  102. p = p->pNext;
  103. }
  104. }
  105. else
  106. {
  107. printf("插入位置错误");
  108. return;
  109. }
  110. }
  111. //求链表的长度
  112. int Length(PNODE pHead)
  113. {
  114. int len = 0;
  115. PNODE p = pHead->pNext; //p指向首节点
  116. while(p != pHead)
  117. {
  118. len ++;
  119. p = p->pNext;
  120. }
  121. return len;
  122. }
  123. //获取第pos个节点的前驱,后继
  124. void getEle(PNODE pHead, int pos)
  125. {
  126. PNODE p = pHead->pNext;
  127. int count = 0;
  128. while(p != pHead)
  129. {
  130. count ++;
  131. if(count == pos) //获取第pos节点的指针
  132. {
  133. if(p->pPrior == pHead)
  134. {
  135. printf("第%d个节点的前驱数头结点\n", pos);
  136. }
  137. else
  138. {
  139. printf("第%d个节点的前驱是:%d\n", pos, p->pPrior->data);
  140. }
  141. if(p->pNext == pHead)
  142. {
  143. printf("第%d个节点的后继数头结点\n", pos);
  144. }
  145. else
  146. {
  147. printf("第%d个节点的后继是:%d\n", pos, p->pNext->data);
  148. }
  149. }
  150. p = p->pNext;
  151. }
  152. }
  153. //删除第pos节点
  154. void dele(PNODE pHead, int pos)
  155. {
  156. PNODE p = pHead->pNext;
  157. int count = 0;
  158. int len = Length(pHead);
  159. if(1 == pos) //删除首节点
  160. {
  161. pHead->pNext = p->pNext;
  162. p->pNext->pPrior = pHead;
  163. }
  164. else if(pos > 1 && pos < len + 1)
  165. {
  166. while(p != pHead)
  167. {
  168. count ++;
  169. if(count == pos - 1) //获取第pos-1节点的指针p
  170. {
  171. p->pNext = p->pNext->pNext;
  172. p->pNext->pNext->pPrior = p;
  173. break;
  174. }
  175. p = p->pNext;
  176. }
  177. }
  178. else
  179. {
  180. printf("删除位置错误");
  181. return ;
  182. }
  183. }

Center

发表评论

表情:
评论列表 (有 0 条评论,312人围观)

还没有评论,来说两句吧...

相关阅读