C语言——链表专题

2024-06-29 1155阅读

C语言——链表专题

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言

点击主页:optimistic_chen和专栏:c语言,

创作不易,大佬们点赞鼓励下吧~

前言

通过这些之前的博客:

数据结构——顺表表专题

数据结构——实现通讯录

数据结构——经典链表OJ

数据结构——经典链表OJ(二)

相信我们对链表已经有了一个模糊了认识,这篇博客将详细为你解释数据结构——链表的“身世”

文章目录

  • 前言
  • 1.链表概念
  • 2.链表结构
  • 3.链表的打印
  • 4.链表的分类
  • 5.双向链表的结构
  • 6.两者区别
  • 完结

    1.链表概念

    链表是一种物理储存结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

    类似于火车车厢,可随时增加或者减少,并且不会影响其他车厢,每一个车厢都独立存在,那要顺利通过每一节车厢,就需要我们拥有下一节车厢的钥匙。

    C语言——链表专题

    那么每节车厢里只存放了🔑吗?当然不是,那样的话,链表的意义在何处体现呢?

    C语言——链表专题

    这样的“车厢”看起来可能有点草率,那么我们继续将链表变得更加直观,更加贴近我们程序员。

    2.链表结构

    C语言——链表专题

    与之前顺序表不同的是,链表里的每节“车厢”都是独立申请下来的空间 ,我们称为**”节点“**

    显而易见,每一个节点的主要组成有两个部分:当前节点要保存的数据和保存下⼀个节点的地址(指针变量)

    图中指针变量 plist 保存的是第⼀个节点的地址,我们称plist此时“指向”第⼀个节点,如果我们希望 plist“指向”第⼆个节点时,只需要修改plist保存的内容为0x0012FFA0。

    指针变量的作用?

    链表中每个节点都是独⽴申请的(即需要插⼊数据时才去申请⼀块节点的空间),我们需要通过指针

    变量来保存下⼀个节点位置才能从当前节点找到下⼀个节点。(注意:最后一个节点的”钥匙“为NULL)

    3.链表的打印

    结合前面结构体的知识,在给定的链表结构中,如何实现节点从头到尾的打印?

    代码示例:

    #include 
    #include 
     
    typedef struct node {
        int data;
        struct node *next;
    } Node;
     
    void printList(Node *head) {
        Node *current = head;//从头节点开始
        while (current != NULL) {
            printf("%d ", current->data);
            current = current->next;
            //每次打印完一个节点,指针都指向下一个节点的地址
        }
        printf("\n");
    }
     
    int main() {
        Node *head = NULL;//头节点为空
        Node *second = NULL;
        Node *third = NULL;
     
        head = (Node*)malloc(sizeof(Node));//申请空间
        second = (Node*)malloc(sizeof(Node));
        third = (Node*)malloc(sizeof(Node));
     
        head->data = 1;//保存数据
        head->next = second;//保存下一个节点的地址
     
        second->data = 2;
        second->next = third;
     
        third->data = 3;
        third->next = NULL;
     
        printList(head);//打印链表
     
        return 0;
    }
    

    注意:

    1、链式机构在逻辑上是连续的,在物理结构上不⼀定连续

    2、节点⼀般是从堆上申请的

    3、从堆上申请来的空间,是按照⼀定策略分配出来的,每次申请的空间可能连续,可能不连续

    4.链表的分类

    链表的结构有很多种,代表不同的算法。

    C语言——链表专题

    4.1单向或双向

    C语言——链表专题

    4.2带头或者不带头

    C语言——链表专题

    4.3循环或者不循环

    C语言——链表专题

    虽然有这么多的链表的结构,但是我们实际中最常⽤还是两种结构:单链表 和双向带头循环链表

    其他的链表我们后续到数据结构部分就会接触到,这里先不提。

    5.双向链表的结构

    带头双向循环链表

    C语言——链表专题

    注意:这里的“带头“和前面单链表所说的”头节点“是两个概念,带头链表里的头节点实际是”哨兵位“,哨兵节点不储存任何有效元素。

    ”哨兵位“的意义:遍历循环链表避免出现死循环。

    6.两者区别

    不同点顺序表链表()单链表
    存储空间上物理上连续逻辑上连续
    随机访问支持不支持
    插入或删除元素可能要搬移元素,效率低只需要修改指针指向
    插入空间不够需要扩容没有容量概念
    应用场景元素高效储存,访问频繁任意位置修改

    完结

    好了,这期的分享到这里就结束了~

    如果这篇博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~

    可以点点关注,避免找不到我~

    我们下期不见不散~~

    这个链表题目还会继续,敬请期待~

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]