当前位置:   article > 正文

C语言单链表基础_(pnode)malloc( sizeof(node) );

(pnode)malloc( sizeof(node) );

 

前言

一直以来对链表都理解的不深,没有个系统的总结学习。今天趁有空,总结一下,方便日后查阅。

一、链表

链表是C语言中的一种数据结构,链表由一系列结点(链表中每一个元素称为结点)组成,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。由此可见,链表不像malloc的一块内存一样是连续顺序存储的,每个节点靠一个指针连接,指针指向的就是下个节点的地址。这就和数组有不同了,数组是在内存中是连续存储的,每个位置下标存入的是固定的值,所以查找很方便,但是如果要求快速插入和删除,数组就显得很局促了。但是链表就可以很快速的插入和删除,因为链表的数据是靠地址链接,我们只需要改变地址指向就可以了。

二、使用链表及链表的基本操作

链表定义

typedef struct Node

{

         int data;

         struct  Node *next;

}NODE,pNODE;

可以看出,一个链表节点是由一个数据域和一个指针域组成。指针域的类型是一个完整的链表结构。注意此处用法,在链表内部定义链表节点的时候,要使用Node,而不是NODE,原因是typedef的用法。在typedef还没执行完的时候,NODE是未定义的,所以会出现未定义错误。

链表的基本操作为创建、查找、增加和删除。

下面贴个代码。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Node
  4. {
  5. int data;
  6. struct Node *pNext;
  7. }NODE,*pNODE;
  8. pNODE CreateList(void)
  9. {
  10. int i, length, data;
  11. pNODE p_new = NULL, pTail = NULL;
  12. pNODE pHead = (pNODE)malloc(sizeof(NODE));//见注1
  13. if (NULL == pHead)
  14. {
  15. printf("内存分配失败!\n");
  16. exit(EXIT_FAILURE);
  17. }
  18. pHead->data = 0;
  19. pHead->pNext = NULL;
  20. pTail = pHead;//见注2
  21. printf("请输入要创建链表的长度:\n");
  22. scanf("%d", &length);
  23. for (i=1; i<length+1; i++)
  24. {
  25. p_new = (pNODE)malloc(sizeof(NODE));
  26. if (NULL == p_new)
  27. {
  28. printf("内存分配失败!\n");
  29. exit(EXIT_FAILURE);
  30. }
  31. printf("请输入第%d个节点的值:\n", i);
  32. scanf("%d", &data);
  33. p_new->data = data;
  34. p_new->pNext = NULL;
  35. pTail->pNext = p_new;
  36. pTail = p_new;
  37. }
  38. return pHead;
  39. }
  40. void PrintList(pNODE pHead)
  41. {
  42. pNODE pt = pHead->pNext;
  43. printf("打印链表:\n");
  44. while (pt != NULL)
  45. {
  46. printf("%d ", pt->data);
  47. pt = pt->pNext;
  48. }
  49. putchar('\n');
  50. }
  51. int IsEmpty(pNODE pHead)
  52. {
  53. if (pHead->pNext == NULL)
  54. return 1;
  55. else
  56. return 0;
  57. }
  58. int GetListLength(pNODE pHead)
  59. {
  60. int length = 0;
  61. pNODE p = pHead->pNext;
  62. while(p != NULL)
  63. {
  64. length++;
  65. p = p->pNext;
  66. }
  67. return length;
  68. }
  69. void insertMylist(pNODE pHead,int addr,int data)
  70. {
  71. pNODE pt = (pNODE)malloc(sizeof(NODE));
  72. pt->data = data;
  73. while(1)
  74. {
  75. if(pHead->data == addr)
  76. {
  77. pt->pNext = pHead->pNext;
  78. pHead->pNext = pt;
  79. break;
  80. }
  81. pHead=pHead->pNext;
  82. }
  83. }
  84. void deleteMylist(pNODE pHead,int addr)
  85. {
  86. pNODE pt;
  87. while(1)
  88. {
  89. if(addr == pHead->data)
  90. {
  91. pHead = pHead->pNext;
  92. break;
  93. }
  94. pt = pHead;//见注3
  95. pHead = pHead->pNext;
  96. }
  97. free(pt->pNext);//见注4
  98. pt->pNext = NULL;
  99. pt->pNext = pHead;
  100. }
  101. int main ()
  102. {
  103. pNODE Mylist = CreateList();
  104. PrintList(Mylist);
  105. printf("length is %d \n",GetListLength(Mylist));
  106. insertMylist(Mylist,3,100);
  107. PrintList(Mylist);
  108. printf("delete %d \n",3);
  109. deleteMylist(Mylist,3);
  110. PrintList(Mylist);
  111. return(0);
  112. }

 

几点解释,大佬绕行。

注1:创建头节点,头结点是第0个节点,后面的节点从1开始计数。

注2:头结点地址给尾结点,创建链表操作都在尾结点进行插入,保证头结点不变。

注3:记录查询到的上次节点位置。

注4:删除节点要进行free操作,否则会有内存泄漏。

 

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

闽ICP备14008679号