动态创建链表

动态创建链表的好处

相比于之前链表的几种功能介绍,都是在设定好的链表基础之上进行插入、删除等,那么如果我们要创建链表元素很多,就得去定义很多个元素结构体,非常不方便,这个时候应该用到动态创建链表

动态创建链表的概念

动态创建链表关键字就是创建,顾名思义就是从无到有创建一个链表,相应操作是一个一个分配结点内存空间,然后输入结点中的数据,并建立结点间的相连关系。

动态创建链表的方法

头插法

输入一个新结点并进行内存空间分配,同时进行判断,若为空指针则将新结点的地址赋给链表头,给链表头开辟内存空间 ,返回链表头head;若不为空指针则将其作为链表头head,同时在输入下个结点时,将链表头的结点地址给新结点 ,同时让新结点作为新的链表头结点

定义一个头插法创建链表函数

cs 复制代码
struct Test* insertFromhead(struct Test *head)
{
        struct Test *new;
        while(1)
        {
                new = (struct Test*)malloc(sizeof(struct Test));//给新结点开辟空间
                printf("input your node num\n");
                scanf("%d",&(new->Data));//给新结点赋值
                if(new->Data == 0)//若输入新结点的值为0执行括号内操作
                {
                        printf("stop insert\n");
                        return head;
                }
                if(head == NULL)
                {
                        head = new;//链表头结点为空指针则将新结点赋给链表头结点,为其开辟内存空间,链表头为新结点且链表只有一个数
                }
                else
                {
                        new->next = head;//链表头结点赋给新界点的下一个结点
                        head = new;//将新结点作为链表头结点
                }
        }
        return head;

}

主函数调用该函数

cs 复制代码
        struct Test *head = NULL;
        head =  insertFromhead(head);
        printLink(head);

运行结果如下:

输入1-6正常运行,输入0时结束链表创建,因为是链表头插入,所以每输入一个数就会作为链表头,则输出结果会与输入的数相反。


尾插法

对输入的链表结点进行判断,若p本身就是空指针,则不需要进行任何操作,只需将尾部插入的新界点赋给链表头head 即可,且链表中只有一个尾部新结点这个数;让p进入死循环,若的下一个不为空指针,则依次对p进行偏移 ,直到p的下一个为空指针,说明到达尾部,跳出循环,让尾部新结点赋给p的下一个结点

定义一个尾插法创建链表函数

cs 复制代码
struct Test* insertBehind(struct Test *head,struct Test *new)
{
        struct Test *p = head;
        if(p == NULL)//若p本身就是空指针
        {
                head = new;//将尾部插入的新界点赋给链表头head即可,且链表中只有一个尾部新结点这个数
                return head;
        }
        while(p->next != NULL)
        {
                p = p->next;//若的下一个不为空指针,则依次对p进行偏移,直到p的下一个为空指针,说明到达尾部
        }
        p->next = new;//尾部新结点赋给p的下一个结点
        return head;
}

主函数调用该函数(这里定义了一个999加在链表尾部)

cs 复制代码
        struct Test *head = NULL;
        struct Test t1 = {999,NULL};
        head =  insertFromhead(head);
        printLink(head);
        head = insertBehind(head,&t1);
        printLink(head);

运行结果如下:

由结果可知成功在尾部插入我们输入的999。

相关推荐
无敌贵点大王3 天前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
码行山野赴时序归途4 天前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
hold?fish:palm6 天前
34 合并K个升序链表
javascript·算法·链表
无敌贵点大王6 天前
RTThread学习记录10——C语言实现面向对象的编程
c语言·stm32·学习·链表
梦帮科技8 天前
Next.js 16 模块化单体实战:App Router、领域模块与 Route Handler 分层
css·数据结构·链表·正则表达式·node.js·json·html5
leikooo9 天前
ARTS 0913: 双栈互补实现队列、CIDR 聚合化解路由膨胀与 AI 作弊串通绝非偶然 Bug
java·链表·个人开发
shirsl9 天前
算法 Day3-队列 / deque + 链表
数据结构·python·算法·链表
wzdark10 天前
基于链表的内存池设计与内存复用机制4
java·数据结构·链表
huang57914710 天前
从缓存行角度优化链表遍历:批处理与预取策略
数据结构·链表·缓存
a1879272183111 天前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表