跟着我让你了解linux C语言单向链表,单向循环链表,双向循环链表,栈和队列容器

时间:2024-10-12 08:21:04

学习是一个能耐得住寂寞的事,不能吃苦,面对其他娱乐不能有效的自律(可以少量的玩,但不能一直玩),我劝你别学了,你这样的今天学的明天忘了,搞鸡毛!!!

下面进入学习!!!!

第一个单向链表:

        单向链表是什么?,看见那个链字了吗?那就相当于一个链子,那为什么是单向的呢,因为链子他是断的,他没连上啊!,链子是什么样的,链子就是前面那节连着后面那一节,但你是c语言,怎么用代码实现?用指针啊,用指针把下一个链子的地址得到啊,但你自己这节链子是有东西,不然拿空气连啊,你用空气试试,所以你要有一个存放自己数据的指针。但他这链子是断的呀,所以你只能从前面或后面去掉或增加链子吧,总不能脑残的去中间来增加或去掉吧。

第二个单向循环链表:

单向循环链表就相当于一条断的链子中间放了一条线将他的头和尾连上去了。

第三个栈:

        栈是什么?你不会以为是c语言的栈空间吧!不不不都说了是容器,容器肯定是存放东西的,这个栈就相对于一个杯子,你放了一个东西进去,然后再放一个东西进去是不是要先将后面的拿出来,才可以拿前面的,所以他就是先进后出,后进先出的,别说东西太小可以先拿前面的,诶他就是差不多杯子周长这么大,后面的掉不到前面那里去!那么问题来了,栈怎么写?用单向链表写啊,你把他的一边的链子不动,不就行了,你就增加和去掉都这一边完成。

第四个单向链表:

        队列是什么?队列就是队列,你排队的意思,这就相当于你去食堂打菜,要去排队,一个一个排,所以你可以对队头和队尾进行操作,你问我为什么不能对其他进行操作?因为你排队还行插队?头都给你打歪,你在队头你直接就打到菜了当然可以走了,你在队尾进行插入。那队列怎么做?是不是不用我说都知道了吧,还是单向链表做,你只用一边增加,一边去掉,不就行了。

第五个双向循环链表:

        双向循环链表听着是不是和单向链表这么像,诶他还真的很像,他就相对于一个完整的链子,头和尾都连上了,那你就问了这怎么增加和去掉啊,这没办法了,只能拆开了,增加的话,就是给他拆开的前面那节链子连上现在加上去的这节链子,然后这节链子连上后面的链子。去掉就不用说了吧,这都不能举一反三那你就去撞墙吧。那怎么实现呢?你单向链表是连上他后面那个链子的地址就行了,你完整的链子再弄一个存储他前面链子的地址就行了,然后中间放你这个链子的数据。

单向链表:
/***********************************************************************
 * 作者:文云龙
 * 创作地点:华清远见
 * 创作时间 :2022-04-08 11:00
 * 文件名   :
 * 版本号   : 1.0 版本
***********************************************************************/
#include ""
#include <>
#include <>
#include <>

/****************************************************
 * 函数名:list_t *list_init(void)
 * 功能:单向链表初始化,并返回初始的链表头节点首地址
 * 参数:无
 * 返回值:
 *      成功: 链表头节点首地址
 *      失败: NULL
 * 注意事项:无
 * *************************************************/
list_t *list_init(void)
{
    //第一步: 申请节点空间
    list_t *node = (list_t *)malloc(sizeof(list_t));
    if (NULL == node) //由于 堆空间 默认只有3个G,可能申请使用完了,申请空间失败
    {
        printf("申请节点空间失败\n");
        return NULL;
    }

    /**************** 特征 ***************
     * 1.头节点 的数据域指针 data = NULL
     * 2.尾节点 的指针域指针 next = NULL
     * 
     * 注意:构造的时候,内部没有元素,所以该节点即是头节点,也是尾节点
     *     所以既拥有头节点特征,也拥有尾节点特征
     * **********************************/

    //第二步: 成员初始化
    node->data = NULL; //1.头节点 的数据域指针 data = NULL
    node->next = NULL; //2.尾节点 的指针域指针 next = NULL

    //第三步: 返回节点指针指向的空间首地址
    return node;
}

/* ------------------- 插入函数 --------------------------------*/
/****************************************************
 * 函数名:bool list_push_back(list_t *list,void *data,int data_size)
 * 功能:向链表容器尾部插入元素
 * 参数:
 *      list_t *list    :  链表容器首地址
 *      void *data