• C/C++之链表的建立


    个人主页点我进入主页

    专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

    C语言刷题

    欢迎大家点赞,评论,收藏。

    一起努力,一起奔赴大厂。

    目录

    1.头插

    1.1简介

     1.2代码实现头插

    1.3分析代码

    2.尾插 

    2.1简介

    2.2代码

    2.3分析代码


     

          学习了结构体后,我给大家带来一种利用结构体写链表的代码,链表是数据结构之一,其中的数据呈线性排列。在链表中,数据的添加和删除都较为方便,就是访问比较耗费时间链表在以后的数据结构中有很重要的作用,链表的写法分为两种,一种是头插,一种是尾插,这两种不同的写法带来哪些有趣的现象呢?让我们往下看。

    1.头插

    1.1简介

    我们现象想一下,链表就是一些数据通过某种方式进行连接,我们可以大概的画成

     1.2代码实现头插

    1. #include
    2. #include
    3. struct ListNode {
    4. int data;
    5. struct ListNode* next;
    6. };
    7. struct ListNode*p=NULL,*head=NULL;
    8. struct ListNode* createlist()
    9. {
    10. int num;
    11. scanf("%d", &num);
    12. while (num != -1)
    13. {
    14. p = (struct ListNode*)malloc(sizeof(struct ListNode));
    15. p->data = num;
    16. p->next = head;
    17. head = p;
    18. scanf("%d", &num);
    19. }
    20. }

    1.3分析代码

            在这里需要我们先创建一个结构体,它包含数据部分和指针部分,在进行创建链表时我们需要先创建一个struct ListNode类型的指针*p和*head,他们有不同的作用,p是用于创建节点,head是用于节点的链接和记录头结点的位置。具体分析如下:我们先对各个节点进行分配内存,也就是p=(struct ListNode*)malloc(sizeof(struct ListNode)),然后进行数据的初始化,也就是对p中的date进行赋值,让p指向的next指向head,第一次head指向NULL由于我们是头插,需要最后一个节点指向空,我们头插是在节点前创建节点也就是说新的p是头节点,不断改变头节点,我们让head指向p方便了节点的连接和记录头节点的位置。当我们按链表打印数据时是逆序输出。

    2.尾插 

    2.1简介

    尾插不同于头插,它相较于头插更难理解,但是进行遍历时是按输入顺序进行打印。

    2.2代码

    1. #include
    2. #include
    3. struct stud_node {
    4. int num; /*学号*/
    5. char name[20]; /*姓名*/
    6. int score; /*成绩*/
    7. struct stud_node* next; /*指向下个结点的指针*/
    8. };
    9. struct stud_node* head, * tail;
    10. void input()
    11. {
    12. struct stud_node* p;
    13. int nums;
    14. scanf("%d", &nums);
    15. head = NULL;
    16. while (nums != 0)
    17. {
    18. p = (struct stud_node*)malloc(sizeof(struct stud_node));
    19. p->num = nums;
    20. scanf("%s", p->name);
    21. scanf("%d", &p->score);
    22. p->next = NULL;
    23. if (head == NULL)
    24. {
    25. head = p;
    26. tail = p;
    27. }
    28. else
    29. {
    30. tail->next = p;
    31. tail = p;
    32. }
    33. scanf("%d", &nums);
    34. }
    35. }

    2.3分析代码

            同样需要我们先进行创建结构体,它包含数据部分和指针部分,在进行创建链表时我们需要先创建一个struct ListNode类型的指针*p和*head,以及*tail,他们有不同的作用,p是用于创建节点,head是记录头结点的位置,tail是用于节点的链接。具体分析如下:我们先对各个节点进行分配内存,也就是p=(struct ListNode*)malloc(sizeof(struct ListNode)),然后进行数据的初始化,也就是对p中的date进行赋值,p的next指向空这一步很重要,如果缺少这一步会导致链表的尾节点的next成为野指针,特别注意在进入循环前需要对tail,和head进行初始化,也就是指向空,我们第一次需要让head指向p,tail指向p,然后再此进入循环,这时我们可以画成

    这时我们让tail的next指向p然后移动tail让他指向p也就是 

    这样就完成了链表的连接。

    今天的内容就结束了,希望大家可以学会链表的两种建立方式,最后不要忘记一键三连呦。 

  • 相关阅读:
    计算机组成原理 | 中央处理器
    一套基于 SpringBoot 和 Vue 的企业级中后台 java 开源项目
    k8s 部署mysql 5.7的完整配置
    ArcGIS Maps SDK for JS:监听按钮点击事件控制图层的visible属性
    力扣栈与队列--总结篇
    go基础学习笔记
    OSG跨平台编译、osgEarth跨平台编译
    pytorch初学笔记(七):神经网络基本骨架 torch.nn.Module
    刚开始学SpringCloud的Eureka带来的问题
    【Jenkins】Jenkins构建前端流水线
  • 原文地址:https://blog.csdn.net/Infernal_Puppet/article/details/132744632