动态创建链表

news2024/11/7 22:36:36

动态创建链表的好处

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

动态创建链表的概念

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

动态创建链表的方法

头插法

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

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

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;

}

主函数调用该函数

        struct Test *head = NULL;
        head =  insertFromhead(head);
        printLink(head);

运行结果如下:

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


尾插法

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

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

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加在链表尾部)

        struct Test *head = NULL;
        struct Test t1 = {999,NULL};
        head =  insertFromhead(head);
        printLink(head);
        head = insertBehind(head,&t1);
        printLink(head);

运行结果如下:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1164915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL在CentOS7环境下的安装

自己由于换了新的服务器,所以打算顺手编写此篇文章记录下来整个环境的重新安装过程 注意:切换为root身份进行操作 -->指令 su root 1、如果存在老安装包,将其卸载 这里我们使用管道grep进行过滤,查看是否之前已经安装过安装包…

【电路笔记】-相量图和相量代数

相量图和相量代数 文章目录 相量图和相量代数1、概述2、相量图3、相量代数3.1 加减3.2 差异化与整合 4、总结 1、概述 交流电信号可以用三种不同的方法来表示,以便表征和实现代数运算。 前面的文章中已经介绍了两种方法,本文稍后将介绍一种新的图形方法…

STM32F103C8T6第一天:认识STM32 标准库与HAL库 GPIO口 推挽输出与开漏输出

1. 课程概述(297.1) 课程要求:C语言熟练,提前学完 C51 2. 开发软件Keil5的安装(298.2) 开发环境的安装 编程语言:C语言需要安装的软件有两个:Keil5 和 STM32CubeMX Keil5 的安装…

使用pinia报错:setriderList()not a function

setriderList是我定义的事件,引用没有问题,但是就是请求不到,刷新就没有了,但是一会又开始报错了,进行排查吧 1:首先,需要确认报错信息是这样的: setriderList() not a function …

rwkv模型lora微调之accelerate和deepspeed训练加速

目录 一、rwkv模型简介 二、lora原理简介 三、rwkv-lora微调 1、数据整理 2、环境搭建 a、Dockerfile编写 b、制造镜像 c、容器启动 3、训练代码修改 四、模型推理 1、模型推理 2、lora权重合并 3、推理web服务 五、总结 由于业务采用的ChatGLM模型推理成本太大了…

短视频账号矩阵系统saas源码搭建/技术

一、短视频矩阵系统建模----技术api接口--获取用户授权 技术文档分享: 本系统采用MySQL数据库进行存储,数据库设计如下: 1.用户表(user): - 用户ID(user_id) - 用户名&#xff08…

【C/C++笔试练习】new和deleted底层原理、静态数据成员、运算符重载、只能使用new创建的类、模版声明、另类加法、走方格的方案数

文章目录 C/C笔试练习选择部分(1)new和deleted底层原理(2)静态数据成员(3)运算符重载(4)程序分析(5)静态数据成员(6)只能使用new创建的…

LeetCode----25. K 个一组翻转链表

题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示…

算法之【时间复杂度】与【空间复杂度】

目录 一、算法 1、算法定义 2、两种算法的比较 3、算法的特性 4、算法设计的要求 二、算法的复杂度 1、时间复杂度 1.1定义 1.2大O的渐近表示法 1.3推导大O阶方法 1.4最坏情况与平均情况 1.5常见的时间复杂度计算示例 🍂常数阶: &#x1f3…

Pinia的十个简答小案例

1. 使用Pinia进行状态管理: import { defineStore } from piniaexport const useCounterStore defineStore({id: counter,state: () > ({count: 0}),actions: {increment() {this.count},decrement() {this.count--}} }) 2. 在组件中使用Pinia: &…

【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker

介绍 本文件主要介绍如何将SpringBoot应用使用Docker方式部署,并用Gitlab CI/CD进行构建和部署。 环境准备 已安装Gitlab仓库已安装Gitlab Runner,并已注册到Gitlab和已实现基础的CI/CD使用创建Docker Hub仓库,教程中使用的是阿里云的Docker…

Docker Tomcat 搭建文件服务器

本文基于openwrt上进行。 步骤 1: 安装 Docker 如果尚未安装Docker,首先需要安装Docker。根据你的操作系统,参考Docker官方文档来完成安装, 这里不做详细介绍。 步骤 2: 拉去docker Tomcat镜像 进入openwrt管理界面,docker选项中 拉取最新…

《算法设计与分析》 蛮力法实验报告一

1.(洛谷 P1008)将 1,2...9 共 9 个数分成三组,分别组成三个三位数,且使这三个三位数构成 1:2:3 的比例,试求出所有满足条件的三个三位数。 输入格式: 无 输出格式: 若干行,每行 3 个数字。按照每行第 1 个数字升序…

Run, Don‘t Walk: Chasing Higher FLOPS for Faster Neural Networks(CVPR2023)

文章目录 AbstractIntroduction过去工作存在的不足我们的工作主要贡献(待参考) Related workCNNViT, MLP, and variants Design of PConv and FasterNetPreliminaryPartial convolution as a basic operatorPConv followed by PWConvFasterNet as a gene…

【下载器】NDM和IDM介绍(含安装包和教程)

1 IDM(增强型下载管理器) 1.1 IDM介绍 官网:Internet Download Manager (IDM) 优缺点: 高速下载: IDM通过多线程下载和分段下载技术,能够显著提高下载速度,从而节省用户的时间。暂停和恢复功…

关于网络编程的3个问题

一、TCP 和 UDP 可以同时绑定相同的端口吗? 答案:可以的 在数据链路层中,通过 MAC 地址来寻找局域网中的主机。在网络层中,通过 IP 地址来寻找网络中互连的主机或路由器。在传输层中,需要通过端口进行寻址&#xff0…

【DP】最长上升公共子序列

一.题目来源 272. 最长公共上升子序列 - AcWing题库 二.简要思路 这道题易知是最长上升子序列(LIS)和最长公共子序列(LCS)的综合应用。我们可以先求最长公共子序列,然后再内循环最长上升子序列即可,直接看…

【ES专题】ElasticSearch搜索进阶

目录 前言阅读导航前置知识特别提醒笔记正文一、分词器详解1.1 基本概念1.2 分词发生的时期1.3 分词器的组成1.3.1 切词器&#xff1a;Tokenizer1.3.2 词项过滤器&#xff1a;Token Filter1.3.3 字符过滤器&#xff1a;Character Filter 1.4 倒排索引的数据结构 <font color…

《基于先验未知盲反卷积技术的包络谱重复瞬态的循环平稳性提取》阅读笔记及代码整理

论文阅读笔记及代码整理 《Extracting cyclo-stationarity of repetitive transients from envelope spectrum based on prior-unknown blind deconvolution technique》 代码有优化整理过&#xff0c;需要请下载&#xff1a;https://mbd.pub/o/bread/ZZaTl5ht 贡献&#xff1…

文件如何变成下载链接?

文件如何变成下载链接&#xff1f;有时候工作需要&#xff0c;要把一些文档&#xff08;比如Word&#xff0c;Excel&#xff0c;PPT&#xff0c;PDF等&#xff09;转成下载链接&#xff0c;作为公众号文章的附件&#xff0c;给粉丝们下载。 把文件转成下载链接&#xff0c;有几…