P5 链表 尾部插入新节点(不是指定点)

目录

前言  

01 链表数据插入之直接在链表尾插入(不是指定点)

02 尾插创建链表优化

示例代码 


前言  

                           
                                

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《C++》✨✨✨ 

🔥 推荐专栏2: 《 Linux C应用编程(概念类)》✨✨✨

📝推荐专栏3: ​​​​​​《 链表 》 ✨✨✨
🍉本篇简介  :  链表数据插入之尾插法

✨ 只有我努力了 才有机会接触成功✨

链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

作为有强大功能的链表,对他的操作当然有许多,比如:

  1. 链表的创建
  2. 链表的链表的遍历打印数据
  3. 链表里面的结构体数据的修改
  4. 链表节点的删除
  5. 链表插入新节点
  6. 链表的数据排序
  7. 链表的反序
  8. 清空链表的元素
  9. 求链表的长度等

 在前面几章,我们学习了

  1. 链表的创建
  2. 链表的链表的遍历打印数据
  3. 链表里面的结构体数据的修改
  4. 求链表的长度等

这一章我们来学习新的知识

尾部插入新节点(不是指定点)

01 链表数据插入之直接在链表尾插入(不是指定点)

在上几章中

我们对链表的数据插入都是有的比较土的方法

 数据节点都是这样一个一个插入

看着就挺离谱的,这一章中我们尝试优化它,我们先把红箭头的那部分先给优化了

我们定义个tailInsertLinkList函数,用于从尾部插入新的链表节点

函数类型为int类型,用于返回标志位,即1和-1,1为成功-1失败

函数参数我们接收一个struct Link的结构体指针和即将要插入数据的数据data

int tailInsertLinkList(struct Link * head,int data)
{
 
}

函数体大概这样了 

然后我们将代码补全

代码补全后大致这样的,我们来看一下代码的意思是什么 

76-79行,NULL == head,这句话的意思是,head为空指针的时候进入if循环语句,然后就是return -1了,为什么直接return了呢?因为传进来的头是空的,我们希望传进来的是空指针,所以放回-1,当然也可以修改成传入空指针也能运行链表(看个人)

80-83行,定义个结构体指针prev指向head头,

然后我们要定义节点,那我们肯定要定义一个结构体充当节点,你可以看到我们使用了malloc函数,给new在堆中开辟了空间,为啥要在堆中开辟呢?作用域的问题,可以看下下篇博文

P28 C++ 对象的生存周期(栈的作用域生存周期)-CSDN博客

定义好了节点,然后就是初始化了,将new的next = NULL;new 的data = data

第84到94行:84行就是遍历的条件了,置于为啥是NULL != prev,可以看下前面的博文,

我们要在链表的尾巴插入新数据,那我们看到要找到链表的尾才行啊,链表的尾巴是什么样的?

可以看到链表的尾部的next是指向NULL的,所以我们可以将这个特点用于查找链表的尾部

 如果找到了,就将链表的尾的next指向new节点

然后返回1,因为成功了,跳出循环

93行的return -1的意思就是没找到链表的尾,出错了返回

我们将代码编译试一下

可以看到尾部插入创建链表已经没问题了

但是我们看这个代码,感觉还是有点不太合理,数据只能提前打好

那我们在优化一下

我们给tailInsertLinkList函数做个封装

02 尾插创建链表优化

int tailInsertLinkListPro(struct Link * head,const int size)
{
    int *bufData = (int*)malloc(sizeof(int)*size);
    for(int i = 0; i < size; i++)
    {
        scanf("%d", bufData+i);
        tailInsertLinkList(head,bufData[i]);
    }
}

大致函数体就长这样了,我们需要两参数,一个是链表头的地址,一个整形数,整形数拿来干嘛的呢?

用于创建节点数的,比如我怎么知道我要创建几个节点呢?

就是利用这个整形数size,传入几个就在键盘输入几个data

就是这样,很简单

示例代码 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Link
{
    int data;
    struct Link *next;
};

/*打印链表数据*/
void PrintLink(struct Link *head)
{
    struct Link *prev = head;
    while (NULL != prev) 
    {
        printf("%d  ", prev->data);
        prev = prev->next;
    }
    printf("\n");
}

/*获取链表的节点数*/
int GetLinkNum(struct Link *head)
{
    struct Link *prev = head;
    int count = 0;
    while (prev != NULL)
    {
        count++;
        prev = prev->next;
    }
    return count;
}

/* 查找链表中的数据,只能找到一个,且不知道节点数*/
int findLinkData(struct Link *head,int data)
{
    struct Link *prev = head;
    while (prev!= NULL)
    {
        if (prev->data == data)
        {
            return 1;
        }
        prev = prev->next;
    }
    return 0;
}

/* 在链表中查找需要的数据,如果有,打印节点号和数据*/
void FindLinkDataPro(struct Link *head,int data)
{
   int count = 0;     //遍历记录节点号
   int NumFd =0;   // Number数据的索引
   int Number[32] = {0};
   struct Link *prev = head;
   while (prev!= NULL)
   {
        if(prev->data == data)
        {
            Number[NumFd++] = count;
        }
        count++; 
        prev = prev->next;
   }
    for(int i = 0; i < NumFd; i++)
    {
        printf("节点号:%d  查找的数据%d\n",Number[i]+1,data);
    }
}

/*尾部顺序插入形成链表*/
int tailInsertLinkList(struct Link * head,int data)
{
    if(NULL == head) 
    {
        return -1;
    }
    struct Link *prev = head;
    struct Link *new = (struct Link*)malloc(sizeof(struct Link ));
    new->data = data;
    new->next = NULL;
    while (NULL != prev)
    {
        if(NULL == prev->next)
        {
            prev->next = new;
            return 1;
        }
        prev = prev->next;
    }
    return -1;
}

int tailInsertLinkListPro(struct Link * head,const int size)
{
    int *bufData = (int*)malloc(sizeof(int)*size);
    for(int i = 0; i < size; i++)
    {
        scanf("%d", bufData+i);
        tailInsertLinkList(head,bufData[i]);
    }
}

int main()
{
    struct Link head = {1,NULL};
    int size = 0;
    puts("请输入你要在链表尾部插入的数据数目");
    scanf("%d",&size);
    printf("请按要求输入%d个数据\n",size);
    tailInsertLinkListPro(&head,size);
    PrintLink(&head);
    //FindLinkDataPro(&link1,2);
    //int findID = 0;
    //findID = findLinkData(&link1,2);
    //printf("findID = %d           0为未找到数据 1则找到数据\n", findID);
    //printf("%d\n", GetLinkNum(&link1));
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS逆向-mytoken之code参数

前言 本文是该专栏的第60篇,后面会持续分享python爬虫干货知识,记得关注。 本文以mytoken为例,通过js逆向获取其code参数的生成规律。具体的“逆向”思路逻辑,笔者将会详细介绍每个步骤,并且将在正文结合“完整代码”进行详细说明。 接下来,跟着笔者直接往下看正文详细…

Halcon参考手册目标检测和实例分割知识总结

1.1 目标检测原理介 目标检测&#xff1a;我们希望找到图像中的不同实例并将它们分配给某一个类别。实例可以部分重叠&#xff0c;但仍然可以区分为不同的实例。如图(1)所示&#xff0c;在输入图像中找到三个实例并将其分配给某一个类别。 图(1)目标检测示例 实例分割是目标检…

轻量封装WebGPU渲染系统示例<40>- 多层材质的Mask混合(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/MaskTextureEffect.ts 当前示例运行效果: 两层材质效果: 三层材质效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export c…

笔记-基于CH579M模块通过网线直连电脑进行数据收发(无需网络)

刚学习&#xff0c;做个记录。 基于CH579M模块通过网线直连电脑进行数据收发(无需网络) 目录 一、工具1、CH579模块2、 网线3、电脑以及网络调试工具 二、操作步骤1、TCP/UDP等程序下载以及设置以太网IP2、网络断开3、检查以太网是否正常显示并稳定4、打开网络调试助手进行测试…

643. 子数组最大平均数 I

子数组最大平均数 I 描述 : 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数。 任何误差小于 10-5 的答案都将被视为正确答案。 题目 : LeetCode 643.子数组最大平均数 :: 643. 子数…

Mybatis 分页查询的三种实现

Mybatis 分页查询 1. 直接在 sql 中使用 limit2. 使用 RowBounds3. 使用 Mybatis 提供的拦截器机制3.1 创建一个自定义拦截器类实现 Interceptor3.2 创建分页查询函数 与 sql3.3 编写拦截逻辑3.4 注册 PageInterceptor 到 Mybatis 拦截器链中3.5 测试 准备一个分页查询类 Data…

优彩云采集器最新版免费下载,优彩云采集器免费

随着网络时代的发展&#xff0c;SEO&#xff08;Search Engine Optimization&#xff0c;搜索引擎优化&#xff09;已经成为网站推广和营销的关键一环。在SEO的世界里&#xff0c;原创内容的重要性愈发凸显。想要做到每天更新大量原创文章&#xff0c;并不是一件轻松的事情。优…

NIO网络编程

Netty学习之NIO基础 - Nyimas Blog 1、阻塞 阻塞模式下&#xff0c;相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停SocketChannel.read 会在通道中没有数据可读时让线程暂停阻塞的表现其实就是线程暂停了&#xff0c;暂停期间不会占用 c…

开源软件license介绍与检测

开源License介绍 通俗来讲&#xff0c;开源许可证就是一种允许软件使用者在一定条件内按照需要自由使用和修改软件及其源代码的的法律条款。借此条款&#xff0c;软件作者可以将这些权利许可给使用者&#xff0c;并告知使用限制。这些许可条款可以由个人、商业公司或非赢利组织…

mediapipe+opencv实现保存图像中的人脸,抹去其他信息

mediapipeopencv MediaPipe本身不提供图像处理功能&#xff0c;它主要用于检测和跟踪人脸、手势、姿势等。如果您想要从图像中仅提取人脸主要信息并去除其他信息. # codingutf-8 """project: teatAuthor&#xff1a;念卿 刘file&#xff1a; test.pydate&…

2022年8月2日 Go生态洞察:Go 1.19版本发布深度解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Tomcat目录介绍

目录 1 Tomcat主目录介绍 2 webapps目录介绍 3 Tomcat配置文件目录介绍&#xff08;conf&#xff09; 1 Tomcat主目录介绍 进入Tomcat目录下&#xff0c;我的目录是/application/tomcat/ cd /application/tomcat/ 安装tree命令 yum -y install tree tree -L 1 tree&…

AD使用交互式BOM插件时应该注意到的一个问题

交互式BOM脚本 插件下载&#xff1a;GitHub - lianlian33/InteractiveHtmlBomForAD 或&#xff1a;GitHub - yukaichao/InteractiveHtmlBom-plugin-for-AD 或&#xff1a;InteractiveHtmlBomForAD-master.zip - 蓝奏云 问题&#xff1a;当PCB文件中出现MARK点时&#xff0c;…

MMseqs2蛋白质序列快速高效比对工具

先看仓库&#xff1a;soedinglab/MMseqs2: MMseqs2: ultra fast and sensitive search and clustering suite (github.com) 无论哪个工具软件&#xff0c;无论你是否熟悉&#xff0c;都推荐你看一下作者原文&#xff0c;这样后面的步骤以及怎么使用头脑里会更清晰。 Fast an…

探索意义的深度:自然语言处理中的语义相似性

一、说明 语义相似度&#xff0c;反应出计算机对相同内容&#xff0c;不同表达的识别能力。因而识别范围至少是个句子&#xff0c;最大范围就是文章&#xff0c;其研究方法有所区别。本文将按照目前高手的研究成绩&#xff0c;作为谈资介绍给诸位。 二、语义相似度简介 自然语言…

Build task failed. Open the Run window to view details.

问题描述 在使用deveco-studio 开发工具进行HarmonyOS第一个应用构建开发时&#xff0c;通过Previewer预览页面时报错&#xff0c;报错信息为&#xff1a;Build task failed. Open the Run window to view details. 如图所示&#xff1a; 问题解决 在设置中&#xff0c;找到…

文件操作-IO

文件操作-IO 1.认识文件1.什么是文件2.文件路径 2.java中操作文件2.1 File类的用法 3.InputStream和OutputStream的用法 1.认识文件 1.什么是文件 文件是计算机系统中用来存储数据的基本单位。它是一种用于持久性存储数据的命名、有序的数据集合.计算机系统通过文件系统来组织…

Simple_SSTI_1-WEB-bugku-解题步骤

——CTF解题专栏—— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 题目信息&#xff1a; 题目&#xff1a;Simple_SSTI_1 作者&#xff1a;valecalida 提示&#xff1a;无 场景&#xff1a; 解题…

Centos图形化界面封装OpenStack Ubuntu镜像

目录 背景 环境 搭建kvm环境 安装ubuntu虚机 虚机设置 系统安装 登录虚机 安装cloud-init 安装cloud-utils-growpart 关闭实例 删除细节信息 删除网卡细节 使虚机脱离libvirt纳管 结束与验证 压缩与转移 验证是否能够正常运行 背景 一般的镜像文件在上传OpenSt…

HttpServletRequest/Response视频笔记

学习地址&#xff1a;144-尚硅谷-Servlet-HttpServletRequest类的介绍_哔哩哔哩_bilibili 目录 1.HttpServletRequest 类 a.HttpServletRequest类有什么作用 b.HttpServletRequest类的常用方法 c.如何获取请求参数 d.解决post请求中文乱码问题 获取请求的参数值相关问题 …