• 无头链表二级指针方式实现(C语言描述)


    无头链表二级指针方式实现

    1. #include
    2. #include
    3. //定义链表结构
    4. typedef struct Node {
    5. int data;
    6. struct Node* next;
    7. }NODE,*LPNODE;
    8. //创建节点
    9. LPNODE createNode(int data) {
    10. LPNODE newNode = (LPNODE)malloc(sizeof(NODE));
    11. if (NULL == newNode) {
    12. printf("数据节点内存申请失败!\n");
    13. return NULL;
    14. }
    15. newNode->data = data;
    16. newNode->next = NULL;
    17. return newNode;
    18. }
    19. //头插
    20. void insertByHead(LPNODE* headNode, int data) {
    21. LPNODE newNode = createNode(data);
    22. if (*headNode == NULL) {
    23. *headNode = newNode;
    24. }
    25. else {
    26. newNode->next = *headNode;
    27. *headNode = newNode;
    28. }
    29. }
    30. //尾插
    31. void insertByTail(LPNODE* headNode, int data) {
    32. LPNODE newNode = createNode(data);
    33. if (*headNode == NULL) {
    34. *headNode = newNode; //插入节点就是头节点
    35. }
    36. else {
    37. LPNODE curNode = *headNode;
    38. while (curNode->next != NULL) {
    39. curNode = curNode->next;
    40. }
    41. curNode->next = newNode;
    42. }
    43. }
    44. //指定位置插入
    45. void insertAppoint(LPNODE* headNode, int data, int pos) {
    46. LPNODE newNode = createNode(data);
    47. LPNODE curNode = *headNode;
    48. if (*headNode == NULL) {
    49. *headNode = newNode;
    50. }
    51. else {
    52. while (curNode->next != NULL && --pos) {
    53. curNode = curNode->next;
    54. }
    55. newNode->next = curNode->next;
    56. curNode->next = newNode;
    57. }
    58. }
    59. //头删
    60. void deleteByHead(LPNODE* headNode) {
    61. if (*headNode == NULL) {
    62. printf("链表为空,没有节点可以删除!\n");
    63. return;
    64. }
    65. else {
    66. LPNODE delNode = *headNode;
    67. *headNode = delNode->next;
    68. free(delNode);
    69. delNode = NULL;
    70. }
    71. }
    72. //尾删
    73. void deleteByTail(LPNODE* headNode) {
    74. if (*headNode == NULL) {
    75. printf("链表为空,没有节点可以删除!\n");
    76. return;
    77. }
    78. else {
    79. LPNODE delNode = *headNode;
    80. LPNODE preNode = *headNode; //删除节点的前一个节点
    81. while (delNode->next != NULL) {
    82. preNode = delNode;
    83. delNode = delNode->next;
    84. }
    85. preNode->next = NULL;
    86. free(delNode);
    87. delNode = NULL;
    88. }
    89. }
    90. //指定数据删除
    91. void deleteByAppointData(LPNODE* headNode, int posData) {
    92. if (*headNode == NULL) {
    93. printf("链表为空,没有节点可以删除!\n");
    94. return;
    95. }
    96. if ((*headNode)->next == NULL) { //一个节点
    97. if ((*headNode)->data == posData)
    98. deleteByHead(headNode);
    99. else
    100. printf("未找到指定节点数据!\n");
    101. }
    102. else {
    103. LPNODE delNode = (*headNode)->next;
    104. LPNODE preNode = *headNode;
    105. while (delNode->next != NULL && delNode->data != posData) {
    106. preNode = delNode;
    107. delNode = delNode->next;
    108. }
    109. preNode->next = delNode->next;
    110. free(delNode);
    111. delNode = NULL;
    112. }
    113. }
    114. //查找
    115. LPNODE searchNode(LPNODE headNode, int posData) {
    116. LPNODE curNode = headNode;
    117. while (curNode != NULL && curNode->data != posData) {
    118. curNode = curNode->next;
    119. }
    120. return curNode;
    121. }
    122. //删除全部指定数据
    123. void deleteAllPosdata(LPNODE* headNode, int posData) {
    124. while (searchNode(*headNode, posData) != NULL) {
    125. deleteByAppointData(headNode, posData);
    126. }
    127. }
    128. //销毁链表
    129. void destroyList(LPNODE* headNode) {
    130. while ((*headNode)->next != NULL) {
    131. deleteByHead(headNode);
    132. }
    133. free(*headNode);
    134. *headNode = NULL;
    135. }
    136. //打印链表
    137. void printList(LPNODE headNode) {
    138. while (headNode != NULL) {
    139. printf("%d\t", headNode->data);
    140. headNode = headNode->next;
    141. }
    142. printf("\n");
    143. }
    144. int main()
    145. {
    146. LPNODE list = NULL;
    147. //头插
    148. insertByHead(&list, 1002);
    149. insertByHead(&list, 1001);
    150. printList(list);
    151. //尾插
    152. for (int i = 0; i < 3; i++)
    153. {
    154. insertByTail(&list, 520 + i);
    155. insertByTail(&list, 520 + i);
    156. }
    157. printList(list);
    158. //指定位置插入
    159. insertAppoint(&list, 1314, 2);
    160. printList(list);
    161. //头删
    162. deleteByHead(&list);
    163. printList(list);
    164. //尾删
    165. deleteByTail(&list);
    166. printList(list);
    167. //指定数据删除
    168. deleteByAppointData(&list, 1314);
    169. printList(list);
    170. //删除所有指定数据
    171. deleteAllPosdata(&list, 521);
    172. printList(list);
    173. if (list != NULL)
    174. printf("链表未销毁!\n");
    175. //销毁链表
    176. destroyList(&list);
    177. if (list == NULL)
    178. printf("链表已销毁!\n");
    179. system("pause");
    180. return 0;
    181. }

     

  • 相关阅读:
    200 多个 npm 包被攻击,Azure 开发者请注意
    1、MongoDb综述
    react基础知识点1
    【翠花Vue之旅】vue打卡8
    如何免费下载RunWayML产生的视频文件
    ceph命令应用
    Go 语言搭建个人博客(qiucode.cn 重构篇 一)
    股票数据分析应用之可视化图表组件
    分拆计划陷入困境,英特尔还能重回巅峰吗?
    机器学习6scikit-learn中的scaler
  • 原文地址:https://blog.csdn.net/ShiXiAoLaNga/article/details/127112814