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

news2025/2/28 2:56:56

目录

前言  

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;
}

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

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

相关文章

跟着chatgpt一起学|2.clickhouse入门(1)

上周我们一起学习了spark&#xff0c;这周让chatgpt帮我们规划下clickhouse的学习路径吧&#xff01; 目录 ​编辑 1.了解Clickhouse的基本概念 1.1 Clickhouse是什么&#xff1f; 1.2 ClickHouse的特点和优势 1.3 Clickhouse的基本架构与组件 1.了解Clickhouse的基本概念…

Sql Server数据库跨机器完整恢复(源文件恢复)

问题描述 在操作系统异常的情况下&#xff0c;SQL Server 和相关的业务系统遭受了不可用的情况。由于操作系统问题&#xff0c;导致旧服务器无法正常运行。为了恢复业务功能并确保数据完整性&#xff0c;采取了以下步骤来在新机器上进行 SQL Server 的重新安装和数据恢复。 面…

软件工程 - 第8章 面向对象建模 - 3 - 动态建模

状态图 状态是指在对象生命周期中满足某些条件、执行某些活动或等待某些事件的一个条件和状况 。 案例一&#xff1a;描述烧水器在工作时的详细行为细节 “人就是一个类&#xff0c;而你”、我”、张三”等都是“人这个类的一个实例&#xff0c;站着”、“躺着等都是对象的一…

POSTGRESQL中如何利用SQL语句快速的进行同环比?

1. 引言 在数据驱动的时代&#xff0c;了解销售、收入或任何业务指标的同比和环比情况对企业决策至关重要。本文将深入介绍如何利用 PostgreSQL 和 SQL 语句快速、准确地进行这两种重要分析。 2. 数据准备 为了演示&#xff0c;假设我们有一张 sales 表&#xff0c;存储了销…

基于社区电商的Redis缓存架构-写多读多场景下的购物车缓存架构

社区电商的购物车缓存架构 在购物车中的功能主要有这几个&#xff1a;商品加入购物车、查看购物车列表、删除购物车商品、选中购物车商品进行结算 这里购物车的场景和之前用户信息以及菜谱分享信息还不同&#xff0c;如果在举办了大型购物活动时&#xff0c;购物车可能需要面…

古琴零基础自学考级入门,从初级到高级古琴教学全集

一、教程描述 本套教程是古琴的组合教程&#xff0c;内容是超级齐全的&#xff0c;包括了很多套完整的古琴教程&#xff0c;来自国内知名的古琴教师、专家&#xff0c;教授等&#xff0c;都是从零基础开始讲起的&#xff0c;而且理论与实践相结合&#xff0c;对于刚学古琴入门…

【LeetCode热题100】【双指针】移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出…

MyBatis的创建,简单易懂的一篇blog

文章目录 一、MyBatis是什么二、操作流程三.配置resource总结 一、MyBatis是什么 MyBatis 是⼀款优秀的持久层框架&#xff0c;它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注…

试用 Windows Terminal 中的 Terminal Chat 功能

文章目录 1. 引言2. 设置 Terminal Chat2.1 安装 Windows Terminal Canary2.2 设置服务地址和密钥 3. 使用 Terminal Chat3.1 打开聊天3.2 对话使用 4. 最后 1. 引言 最近&#xff0c;Windows Terminal Canary 推出了一项名为 Terminal Chat 的新功能&#xff0c;它允许用户在…

深入理解贝叶斯分类与朴素贝叶斯模型(Naive Bayes, NB):从基础到实战

目录 贝叶斯分类 公式 决策规则 优点 贝叶斯分类器的例子——垃圾邮件问题 1. 特征&#xff08;输入&#xff09;&#xff1a; 2. 类别&#xff1a; 3. 数据&#xff1a; 4. 模型训练&#xff1a; 注&#xff1a;类别先验概率 5. 模型预测&#xff1a; 朴素贝叶斯模…

进程间通信 管道

在Linux中&#xff0c;管道是一种通信机制&#xff0c;用于将一个程序的输出直接连接到另一个程序的输入。从本质上说&#xff0c;管道也是一种文件&#xff0c;但它又和一般的文件有所不同&#xff0c;它可以克服使用文件进行通信的两个问题&#xff0c;具体表现为限制管道的大…

基于SSM的生鲜在线销售系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

[传智杯 #2 决赛] 补刀

题目描述 UIM 在写程序的空闲玩一款 MOBA 游戏。 当敌方的小兵进入到我方防御塔的范围内&#xff0c;就会持续受到防御塔造成的伤害&#xff1b;当然我方英雄也可以对它造成伤害。当小兵的血量降到了 0 或者更低&#xff0c;就会被击杀。为了获得经验&#xff0c;UIM 希望在防…

Vmware 中的Centos7.9 和 主机共享文件夹

1.开启虚拟机的共享文件夹功能。 虚拟机->设置->选项-共享文件夹&#xff1a;【总是启用】 2.添加一个共享文件夹 3. 虚拟机中创建一个文件夹 mkdir share cd share pwd /www/backup/share4.挂载共享文件夹 /usr/bin/vmhgfs-fuse .host:/share /www/backup/share -o s…

Java 设计模式系列:代理模式

文章目录 介绍静态代理基本介绍应用实例静态代理优缺点 动态代理基本介绍JDK 中生成代理对象的 API Cglib 代理基本介绍实现步骤 介绍 1&#xff09;代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象 2&#xff09…

深入理解原码、反码、补码(结合C语言)

一、引出问题 在学习C语言单目操作符中~按位取反的过程中&#xff0c;对这样一段代码的结果产生了疑惑&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int a 0;int b ~a;//按位取反printf("%d\n", b);return 0; }输出结果…

系列十七、理解SpringBoot中的starter 自定义一个starter

一、概述 作为后端Java程序员&#xff0c;基本上公司的日常开发都是基于SpringBoot进行的&#xff0c;我们使用SpringBoot也是沉醉于它的各种各样的starter带给我们的便利&#xff0c;这些starter为我们带来了众多的自动化配置&#xff0c;通过这些自动化配置&#xff0c;我们可…

为自己创建的游戏编程源码申请软件著作权详细流程(免费分享模板)

以为我这篇文章制作的游戏申请软件著作权为例 Ren‘py 视觉小说 交互式故事游戏制作过程学习笔记(Windows下实现)(多结局游戏)-CSDN博客 一、网站注册 申请软著时&#xff0c;所有的著作权人都需要在中国版权保护中心官网注册账号&#xff0c;并进行实名认证后&#xff0c;才…

使用WalletConnect Web3Modal v3 链接钱包基础教程

我使用的是vueethers 官方文档&#xff1a;WalletConnect 1.安装 yarn add web3modal/ethers ethers 或者 npm install web3modal/ethers ethers2.引用 新建一个js文件&#xff0c;在main.js中引入&#xff0c;初始化配置sdk import {createWeb3Modal,defaultConfig, } from…

【预计IEEE出版|EI征稿通知】第六届下一代数据驱动网络国际学术会议 (NGDN 2024)

第六届下一代数据驱动网络国际学术会议 (NGDN 2024) The Sixth International Conference on Next Generation Data-driven Networks 2024年4月26-28日 | 中国沈阳 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉 (IEEETrustCom-2022) 成功举…