当前位置:   article > 正文

数据结构-单链表_单链表的特点

单链表的特点

单链表

//单链表属于线性表

一、单链表的概念

单链表是什么?

链表是数据结构中线性表的一种,其中的每个元素实际上是一个单独的结构体对象,而所有对象都通过每个元素中的指针链接在一起。它是以结构体为节点,将一个结构体看成数据域和指针域两个部分,数据域用于存储数据,指针域用于连接下一个节点。链表中每个结构体对象叫做节点,其中第一个数据节点叫做链表的首元节点;如果第一个节点不用于存储数据,只用于代表链表的起始点,则这个节点称为链表的头节点。

单链表的特点:

1、单链表没有固定的长度,可以自由增加节点。 2、单链表能够实现快速的插入删除数据。 3、与数组类似,单链表也是一种线性数据结构。 4、单链表的尾结点的后继必定指向空。 单链表和数组的区别:数组是顺序存储的,而单链表是链式存储的。

单链表的节点类型

  1. //结构体类型:单链表节点的类型
  2. struct node
  3. {
  4. int id;//节点要保存的数据
  5. struct node*next;//指针成员:指向下一个节点
  6. };

二、单链表的初始化

  1. //初始化单链表
  2. //申请一个头节点:让head指向这个节点
  3. //头节点:不保存数据,单链表开头的标志
  4. struct node* init()
  5. {
  6. //temp是一个临时指针变量:保存从堆区申请的内存首地址
  7. struct node*temp = (struct node*)malloc(sizeof(struct node));
  8. temp->id = 0;
  9. temp->next = NULL;
  10. return temp;
  11. }

三、单链表元素的增加

  1. //头插法三步骤
  2. //1、申请新节点,把数据放进这个新节点S
  3. //2、新节点S指针域保存头节点的下一个节点的地址
  4. //3、头节点指针保存新节点S的地址
  5. void insert(struct node*head,int data)//data:要增加的元素值
  6. {
  7. //1、申请新节点,把数据放进这个新节点S
  8. struct node*S = (struct node*)malloc(sizeof(struct node));
  9. S->id = data; //新节点保存要增加的元素值
  10. //2、新节点S指针域保存头节点的下一个节点的地址
  11. S->next = head->next;
  12. //3、头节点指针保存新节点S的地址
  13. head->next = S;
  14. }
  15. //尾插法
  16. //1、定义一个指针变量P,P用来保存当前单链表中的最后一个节点的地址
  17. //2、定义一个指针变量S,申请一个新的节点(保存要增加的数据),生成新节点S
  18. //3、新节点S指针为空,节点P的指针域指向新节点S
  19. void insertEnd(struct node*head, int data)
  20. {
  21. //1、定义一个指针变量P,P用来保存当前单链表中的最后一个节点的地址
  22. struct node*p = head;
  23. while (p->next != NULL)//P不是单链表中最后一个节点
  24. {
  25. //p++;//不可以的,因为内存 不连续
  26. p = p->next;//p指向下一个节点
  27. }
  28. //循环执行完之后,p指向单链表中的最后一个节点
  29. //2、定义一个指针变量S,申请一个新的节点(保存要增加的数据),生成新节点S
  30. struct node*S = (struct node*)malloc(sizeof(struct node));
  31. S->id = data; //新节点保存要增加的元素值
  32. //3、新节点S指针为空,节点P的指针域指向新节点S
  33. S->next = p->next;
  34. p->next = S;
  35. }

四、输出单链表中的所有元素

  1. void print(struct node*head)
  2. {
  3. if (head == NULL)
  4. {
  5. printf("单链表不存在\n\n");
  6. return;
  7. }
  8. struct node*p = head->next;
  9. while (p != NULL)//是p指向下一个节点,当p是最后一个节点之后的NULL,结束循环
  10. {
  11. printf("%d --> ", p->id);
  12. p = p->next;
  13. }
  14. printf("NULL\n\n");
  15. }

五、单链表元素的删除

  1. /**************单链表——元素的删除*****************/
  2. //1、定义两个指针变量P1、P2,P1指向头节点,P2指向头节点的下一个节点
  3. //2、使用循环,使P1、P2同时往后移,当P2指向要删除的这个节点时,结束循环
  4. //3、P1指向的节点里面的指针 保存 P2 下一个节点的地址
  5. //4、释放P2指向的节点
  6. void del(struct node*head,int val)//val表示要被删除的值
  7. {
  8. //P1指向删除节点的前驱节点
  9. //P2指向删除节点
  10. struct node*P1 = head;
  11. struct node*P2 = head->next;
  12. while (P2 != NULL)//P2不为NULL,正在遍历单链表中的数据
  13. {
  14. if (P2->id == val)//当P2指向要被删除的节点时
  15. {
  16. P1->next = P2->next;
  17. free(P2);
  18. P2 = P1->next;
  19. }
  20. else//两个指针变量同时往后移
  21. {
  22. P1 = P1->next;
  23. P2 = P2->next;
  24. }
  25. }
  26. }

六、单链表元素的查找

  1. int find(struct node*head, int val)//val表示要查找的值
  2. {
  3. int flag = 0;//标记是第几个节点
  4. struct node*p = head->next;
  5. while (p != NULL)
  6. {
  7. flag++;
  8. if (p->id == val)//找到要查找的值
  9. {
  10. printf("这个值:%d 在第 %d 个位置\n\n", p->id,flag);
  11. }
  12. p = p->next;
  13. }
  14. return val;
  15. }

七、单链表元素的修改

  1. void change(struct node*head, int val,int data)//val表示要被修改的值 ,data要被修改成的值
  2. {
  3. struct node*p = head->next;
  4. while (p != NULL)
  5. {
  6. if (p->id == val)//找到要查找的值
  7. {
  8. p->id = data;
  9. }
  10. p = p->next;
  11. }
  12. }

八、整个链表节点的释放

  1. //需要改变主函数中head的值吗? 需要
  2. void Allclear(struct node**list)//&head传过来 list=&head
  3. {
  4. struct node*p = (*list)->next;//p指向头节点的下一个节点
  5. while (p != NULL)
  6. {
  7. //1、头节点里面的指针成员 保存 p指向的下一个节点的地址
  8. //2、释放p节点
  9. //3、更新要删除的节点,p指向头节点后的第一个节点
  10. (*list)->next = p->next;
  11. free(p);
  12. p = (*list)->next;
  13. }
  14. free(*list);//释放头节点
  15. *list = NULL;
  16. }

九、主函数

  1. //***********单链表——头节点的初始化
  2. //头指针变量——保存单链表节点的首地址
  3. struct node* head = NULL;
  4. head = init();
  5. //单链表元——元素的增加
  6. //头插法
  7. for (int j = 1; j <= 5; j++)
  8. {
  9. insert(head, j);
  10. }
  11. print(head);
  12. //尾插法
  13. for (int j = 1; j <= 5; j++)
  14. {
  15. insertEnd(head, j);
  16. }
  17. print2(head);
  18. //单链表元——元素的删除
  19. del(head, 3);
  20. print(head);
  21. //单链表元——元素的查找、修改
  22. find(head, 3);
  23. change(head, 3, 66);
  24. print(head);
  25. //单链表元——节点的释放
  26. Allclear(&head);
  27. printf("%p", head);
  28. print(head);
  29. return 0;
  30. }

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

闽ICP备14008679号