当前位置:   article > 正文

链表的概述,节点的定义,链表的创建,链表的遍历_链表节点定义

链表节点定义

目录

链表概述

链表创建

        节点的定义

        头节点的创建

        后续节点的创建并连接形成链表——头插法

        后续节点的创建并连接形成链表——尾插法

        链表的遍历——输出链表数据域内容


链表概述

        链表,别名 链式存储结构 或 单链表 ,用于存储逻辑关系为  一对一  同类型 的数据。 与顺序表不同,链表不限制数据的物理存储状态,物理存储空间可以不连续。换句话说,链表存储的数据元素,其物理存储位置是随机的分散的,由其指针域指向后续节点的地址来连接形成线性表的一种存储方式,像用链子把不同的物体连接在一起一样。

链表创建

        链表一般为单链表,由于需要同时记录数据和地址,故需要用到结构体来进行链表节点的数据类型定义。

        节点的定义

  1. //节点的定义
  2. struct Node{
  3.     int data; //数据域
  4.     struct Node *next; //指针域
  5. };
  6. //struct 关键词
  7. //用于自定义数据类型

此时我们已经定义了数据类型,此类型用于创建链表的节点使用。


        头节点的创建

  1. //主函数
  2. int main(){
  3. //定义节点类型的指针head,申请节点类型的空间大小,用作头节点。
  4. struct Node *head = (struct Node *)malloc(sizeof(struct Node));
  5. //此时只存在头节点,所以他的指针域指向为空。
  6. head->next = NULL;
  7. return 0;
  8. }

头节点数据域大部分情况下不做数据的存储,故不向其数据域存储内容。


        后续节点的创建并连接形成链表——头插法

  1. //创建链表————头插法
  2. void fun(struct Node *head) {
  3. //传参传的是头节点的地址,所以用指针接收地址
  4. if(head == NULL){
  5. printf("头指针未指向头节点");
  6. return;
  7. }
  8. printf("请输入链表长度");
  9. int len;
  10. scanf("%d",&len);
  11. //指针p指向头节点
  12. struct Node *p=head;
  13. struct Node *q;//临时节点
  14. for(int i=0; i<len; i++) {
  15. //临时指针申请空间
  16. q=(struct Node *)malloc(sizeof(struct Node));
  17. printf("请输入数据域元素:");//数据域存入内容
  18. scanf("%d",&q->data);
  19. q->next=p->next;//新节点q指向p的地址
  20. p->next=q;//p指向q
  21. }
  22. }

创建的新节点连接在头节点后一个位置
导致链表内容被倒置
如    录入数据域内容: 1 2 3 4 5
        输出数据域内容: 5 4 3 2 1


        后续节点的创建并连接形成链表——尾插法

  1. //创建链表————尾插法
  2. void fun2(struct Node *head) {
  3. //传参传的是头节点的地址,所以用指针接收地址
  4. if(head == NULL){
  5. printf("头指针未指向头节点");
  6. return;
  7. }
  8. //指针p指向头节点
  9. struct Node *p=head;
  10. struct Node *q;//临时节点
  11. printf("请输入链表长度");
  12. int len;
  13. scanf("%d",&len);
  14. for(int i=0; i<len; i++) {
  15. //临时指针申请空间
  16. q=(struct Node *)malloc(sizeof(struct Node));
  17. printf("请输入元素:");
  18. scanf("%d",&q->data);
  19. q->next=NULL;//新节点q指针域指向空
  20. p->next=q;//p指向新节点q
  21. p=q;//p位置更新到q位置
  22. }
  23. }

创建的新节点永远在链表的最后一位
输入顺序就是输出顺序

如    录入数据域内容: 1 2 3 4 5
        输出数据域内容: 1 2 3 4 5


        链表的遍历——输出链表数据域内容

  1. //遍历链表
  2. void shuchu(struct Node *head) {
  3. //传参传的是头节点的地址,所以用指针接收地址
  4. if(head == NULL){
  5. printf("头指针未指向头节点");
  6. return;
  7. }
  8. struct Node *p=head->next; //结构体指针指向头节点的第一个节点
  9. //指针不为空进行循环
  10. while(p) { //等价于 p != NULL;
  11. printf("%d ",p->data); //输出数据域内容
  12. p=p->next; //指针后移指向下一个节点
  13. }
  14. }

由于头节点的数据域不进行内容存储
故指针p直接指向头节点的下一个节点,即首元节点

2023年3月20日
持续更新

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

闽ICP备14008679号