当前位置:   article > 正文

单链表的基本操作(初始化,插入,删除等)_将单链表的初始化和插入放到一个函数里

将单链表的初始化和插入放到一个函数里

单链表:单链表是线性表链式存储的一种形式,其中的结点一般含有两个域,一个是存放数据信息的数据域(Data),另一个是指向该结点的后继结点存放地址的指针域(Next),一个单链表必须有一个首指针指向单链表中的第一个结点。

单链表的结构如下所示:

typedef int DataType;
typedef struct Node
{
    DataType data;  //存放数据信息的数据域
    struct Node* next;   //后继结点存放地址的指针域
}Node, *pNode,*pList;

1,如下是单链表主要基本实现,我将实现的基本接口统一放入一个LinkList.h的头文件中:

  1. #pragma once
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<assert.h>
  5. #include<malloc.h>
  6. typedef int DataType;
  7. typedef struct Node
  8. {
  9. DataType data;
  10. struct Node* next;
  11. }Node, *pNode, *pList;
  12. void InitLinkList(pList* pplist);//链表的初始化
  13. pNode BuyNode(DataType d);//结点的获取
  14. void DestroyLinkList(pList* pplist);//链表的销毁
  15. void PrintLinkList(pList plist);//链表的打印
  16. void PushBack(pList* pplist, DataType d);//将数据尾插到链表中
  17. void PushFront(pList* pplist, DataType d);//将数据头插到链表中
  18. void PopFront(pList* pplist);//删除头结点
  19. pNode Find(pList plist, DataType d);//查找一个数是否在链表中
  20. void Insert(pList* pplist, pNode pos, DataType d);//在链表某一个位置插入一个数(位置之后插入)
  21. void Erase(pList* pplist, pNode pos);//指定位置删除
  22. void LinklistClear(pList *pplist);//清空链表
  23. int LinklistSize(pList plist);//求链表的长度

2.然后将主函数放入到一个LinkList.c中:

  1. #include"LinkList.h"
  2. void InitLinkList(pList *pplist) //链表的初始化
  3. {
  4. assert(pplist); //断言,判断链表是否存在,下同
  5. *pplist = NULL;
  6. }
  7. pNode BuyNode(DataType d) //结点的获取
  8. {
  9. pNode newnode = (pNode)malloc(sizeof(Node));
  10. if (NULL == newnode)
  11. return NULL;
  12. newnode->next = NULL;
  13. newnode->data = d;
  14. return newnode;
  15. }
  16. void PushBack(pList* pplist, DataType d)//尾插法,将一个结点尾插到链表中
  17. {
  18. pList newnode = NULL;
  19. assert(pplist);
  20. newnode = BuyNode(d);
  21. if (NULL == *pplist)//空链表
  22. *pplist = newnode;
  23. else
  24. {
  25. pList pCur = *pplist;//非空链表
  26. while (pCur->next)
  27. pCur = pCur->next;
  28. pCur->next = newnode;
  29. }
  30. }
  31. void PushFront(pList* pplist, DataType d)//头插法,将一个结点头插到链表中
  32. {
  33. pList newnode = NULL;
  34. assert(pplist);
  35. newnode = BuyNode(d);
  36. if (NULL == newnode)
  37. return;
  38. newnode->next=*pplist;
  39. *pplist = newnode;
  40. }
  41. void PopFront(pList* pplist)//删除头结点
  42. {
  43. pList pnode= NULL;
  44. assert(pplist);
  45. if (NULL == *pplist)//链表为空,不拿删除
  46. return;
  47. pnode= *pplist;
  48. *pplist = pnode->next;
  49. free(pnode);
  50. pnode = NULL;
  51. }
  52. void DestroyLinkList(pList* pplist)//链表的销毁
  53. {
  54. LinklistClear(pplist);
  55. }
  56. pNode Find(pList plist, DataType d)//查找一个结点是否在链表存在
  57. {
  58. pList pCur = plist;
  59. while (pCur)
  60. {
  61. if (d == pCur->data)
  62. return pCur;
  63. pCur = pCur->next;
  64. }
  65. return NULL;
  66. }
  67. void Insert(pList* pplist, pNode pos, DataType d)//指定位置插入,后插
  68. {
  69. pList newnode = NULL;
  70. assert(pplist);
  71. if (NULL == *pplist || NULL == pos)//链表为空和给定结点不存在
  72. return;
  73. newnode =BuyNode(d);
  74. if (NULL == newnode)//开辟结点失败
  75. return;
  76. //多个结点
  77. newnode->next = pos->next;
  78. pos->next = newnode;
  79. }
  80. void Erase(pList* pplist, pNode pos)//指定删除结点
  81. {
  82. pList pCur = NULL;
  83. assert(pplist);
  84. if (NULL == *pplist || NULL == pos)//判断链表是否为空和给定节点存不存在
  85. return;
  86. if (pos == *pplist)//如果只有一个节点,直接用头删
  87. PopFront(pplist);//调用头删函数
  88. /*else//有多个节点
  89. {
  90. pCur = *pplist;
  91. while (pCur&&pCur->next != pos)
  92. pCur = pCur->next;
  93. if (pCur)//如果不为空,则执行下面
  94. {
  95. pCur->next = pos->next;
  96. free(pos);
  97. // }*///难点
  98. // }
  99. }
  100. void LinklistClear(pList *pplist)//清空结点
  101. {
  102. pList Delnode = NULL;
  103. assert(pplist);
  104. while (*pplist)
  105. {
  106. Delnode = *pplist;
  107. Delnode = Delnode->next;
  108. free(Delnode);
  109. }
  110. }
  111. int LinklistSize(pList plist)//计算链表中结点的个数
  112. {
  113. pList pCur = plist;
  114. int count = 0;
  115. while (pCur)
  116. {
  117. count++;
  118. pCur = pCur->next;
  119. }
  120. return count;
  121. }
  122. void PrintLinkList(pList plist)//打印链表
  123. {
  124. pList pCur = plist;
  125. while (pCur)
  126. {
  127. printf("%d->", pCur->data);
  128. pCur = pCur->next;
  129. }
  130. printf("NULL\n");
  131. }
  132. TestLinklist2()
  133. {
  134. pNode plist;
  135. InitLinkList(&plist);
  136. PushFront(&plist, 1);
  137. PushFront(&plist, 2);
  138. PushFront(&plist, 3);
  139. PushFront(&plist, 4);
  140. PushFront(&plist, 5);
  141. PrintLinkList(plist);
  142. //Find(plist,3);
  143. /*PopFront(&plist);
  144. PopFront(&plist);
  145. PopFront(&plist);
  146. PopFront(&plist);
  147. PrintLinkList(plist);*/
  148. }
  149. TestLinklist1()
  150. {
  151. pNode plist,pos;
  152. InitLinkList(&plist);
  153. PushBack(&plist, 1);
  154. PushBack(&plist, 2);
  155. PushBack(&plist, 3);
  156. PushBack(&plist, 4);
  157. PushBack(&plist, 5);
  158. PrintLinkList(plist);
  159. pos=Find(plist, 3);
  160. if (pos)
  161. Insert(&plist, pos, 6);
  162. PrintLinkList(plist);
  163. Erase(&plist, pos);//删除结点
  164. PrintLinkList(plist);
  165. printf("size=%d" ,LinklistSize(plist));
  166. LinklistClear(&plist);
  167. printf("size=%d", LinklistSize(plist));
  168. DestroyLinkList(&plist);
  169. }
  170. int main()
  171. {
  172. //TestLinklist1();
  173. //TestLinklist2();
  174. return 0;
  175. }

以上主要就是不带头单链表的基本实现,带头单链表基本实现与不带头单链表实现基本相同,带头单链表在初始化是,获取一个结点就可以了。。。

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

闽ICP备14008679号