IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> ^0^大家知道怎样用C语言实现单链表吗 -> 正文阅读

[数据结构与算法]^0^大家知道怎样用C语言实现单链表吗

? ? ? ? 前言:今天我来讲讲C语言如何实现传统的链表,顾名思义,传统的就是过去的,在实际项目中很少用到的,与现在的主流的抽象链表(如,linux内核双向循环链表)相比存在着致命的缺陷,但是,凡事多有个但是啊,看问题要看本质;传统链表相比更容易理解和掌握。话不多说,今日我们?讲讲带头结点的单向链表,相信我们都有收货^0^:

一、概念:

????????链表,既链式存储线性表。

? ? ? ? 单向链表有两类:

? ? ? ? ? ? ? ?1.有头结点(头结点,不存储数据,负责管理整条链表的结点)的单向链表

???????????????2.以首结点开头,无头结点的单向链表(单向:只有上一个结点指向下一个结点的方向

二、优点:

????????C语言中,链式存储通过指针实现,避免了顺序存储需要占用连续空间弊端(程序可申请的连续空间小,一般30Mb左右),又可以通过指针引用堆空间(程序可申请的空间,一般将达到2G左右)大大提高了数据存储量

? ? ? ? 除此之外,对于一些对增、删操作频繁的数据,链式存储相较于顺序存储更有优势

三、设计带头结点的单向链表步骤:

? ? ? ? 1.设计链表结点的结构体

struct node_linked_list{
    int data;//存储数据
    struct node_linked_list *next; //指向下一个结点的指针
};

?

? ? ? ? 2.设计头结点的结构体

//头结点我们可以形象的称之为管理员结构体
struct linked_list_head{
    struct node_linked_list *head; //head指向链表的首结点
    int nodeNumber; //记录除头结点外,整条链表的结点数目
};

?

? ? ? ? 3.初始化链表(我们考虑这条新链表有首结点,无首结点的空链表你们试试^0^)

/*
init_list_head():创造一条只有首结点的链表
参数:
        int inputData    首结点要存入的数据
返回值:
        成功    返回新链表的头结点
        失败    返回NULL
*/
struct linked_list_head* init_list_head(int inputData)
{
    //为头结点申请堆空间
    struct linked_list_head* managerLinkedList = malloc(sizeof( struct linked_list_head));
    if(managerLinkedList == NULL)
    {
        printf("申请头结点的堆空间失败\n");
        return NULL; //失败返回空指针NULL
    }

    //申请成功,头结点初始化
    managerLinkedList->nodeNumber = 0;
    managerLinkedList->head = NULL;

    //为首结点申请空间
    struct node_linked_list* newNode = malloc(sizeof( struct linked_list_head));
    if(newNode == NULL)
    {
        printf("申请首结点的堆空间失败\n");
        return NULL; //失败返回空指针NULL
    }

    //申请成功,首结点初始化
    newNode->data = inputdata
    newNode->next = NULL;

    //头结点指向首结点
    managerLinkedList->head = newNode;
    
    return mangerLinkedList; //返回头结点
}

? ? ? ? 4.头插法,增加链表结点

/*
add_head_linked_list()采用头插法,存储链表数据
参数:    
        struct linked_list_head* managerLinkedList    指明被插入结点的链表头结点
        int inputData  插入的数据
返回值
        成功/失败    链表的头结点
*/
struct linked_list_head* add_head_linked_list(struct linked_list_head* managerLinkedList,int inputData)
{
    //申请新结点的堆空间
    struct node_linded_list* newNode = malloc(sizeof(struct node_linded_list));
    //申请失败
    if(newNode == NULL)
    {
        printf("新结点申请堆空间失败\n");
        return managerLinkedList;
    }

    //初始化新结点
    newNode->data = inputData;
    newNode->next = NULL;

    //头插法,插入链表中
    newNode->next = managerLinkedList->head;//新结点先指向首结点
    managerLinkedList->head = newNode;//最后头结点再指向新结点

    return managerLinkedList;//返回头结点
}

? ? ? ? 好了^0^,?今天就到这里了,亲!!

? ? ? ? 相信对应聪明的你来说,实现一些操作应该是下意思,为您推荐:实现链表的增删查改,进一步的有,链表的排序等

? ? ? ? 别忘了点赞,拜!!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 12:10:17  更:2021-09-03 12:10:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:26:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码