P6 链表 插入数据节点 尾插法指定节点插入

2023-12-03 08:20

本文主要是介绍P6 链表 插入数据节点 尾插法指定节点插入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言                                                  ​编辑               

01  链表指定节点后插入数据(根据节点号插入)

 测试代码

02 链表指定节点后插入数据(根据节点的数据插入)

尾插法的代码 


前言  
                           
                                    

🎬 个人主页:@ChenPi

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

🔥 推荐专栏2: 《 Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》✨✨✨

📝推荐专栏3: ​​​​​​《 链表_@ChenPi的博客-CSDN博客 》 ✨✨✨
🍉本篇简介  :  链表数据插入之尾插法

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

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

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

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


在前面几章,我们学习了

  1. 链表的创建
  2. 链表的链表的遍历打印数据
  3. 链表里面的结构体数据的修改
  4. 求链表的长度等
  5. 还有链表结尾插入数据节点,非指定节点

01  链表指定节点后插入数据(根据节点号插入)

我们要在指定的节点后插入数据,提醒一下,这里的节点是指的第几个节点,不是按数值来查

我们定义个函数tailInsertNodeLinkList(),函数的返回值尾int,因为我们需要返回标志位

用于查看是否错误

这个函数有三个参数,

参数1位一个结构体的指针,因为要传如头节点,

参数2为一个整形数,用于找到第几个节点

参数3为一个整形数,为节点的数据

根据需求,我们可以知道函数体的大致模样了

int tailInsertNodeLinkList(struct Link * head,const int size,const int data)
{}

 然后我们根据需求将代码补全

我们看代码进行分析一下

第109行,定义一个结构体指针,指向了链表头,原因是,操作链表的时候最好不要直接操作链表

第110行,定义了一个整形变量cnt,用于遍历时记录目前是第几节点

第110 - 113行就是定义了一个新节点,并初始化

第114 - 124行就是链表的遍历了

第116行,if语句进行判断,如果当前节点 = 目标节点,就进入if语句

里面到底做了什么事呢?

大致就是这样,先让新的节点的next = prev的next,

在将prev的next指向new

就是这样,很简单

我们代码测试一下

 

链表开始的时候只有头节点,我们先用上一章的函数,尾插法增长了链表,我这里输入了8和5

那按道理链表现在又了三个数1 8 2

现在我要用 这一章的代码在第二个节点插入数据5

所以最后打印的时候是1 8 5 2

没有问题

 测试代码

#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 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]);}
}/*参数1 结构体指针头节点的地址,参数2第几个节点后插入数据,参数3要插入的数据*/
int tailInsertNodeLinkList(struct Link * head,const int size,const int data)
{struct Link *prev = head;int cnt = 1;struct Link *new = (struct Link*)malloc(sizeof(struct Link ));new->next = NULL;new->data = data;while (NULL != prev){if(cnt == size){new->next = prev->next;prev->next = new;return 1;}cnt++;prev = prev->next;}return -1;
}int main()
{struct Link head = {1,NULL};int size = 0;puts("请输入你要在链表尾部插入的数据数目");scanf("%d",&size);printf("请按要求输入%d个数据\n",size);tailInsertLinkListPro(&head,size);tailInsertNodeLinkList(&head,2,5);PrintLink(&head);return 0;
}

02 链表指定节点后插入数据(根据节点的数据插入)

刚写完根据目标节点数进行节点插入,现在我们写一个根据节点的数据进行插入,如果于于目标数据一致,则在其后插入一个新节点

如果成功返回目标目前节点号

失败返回-1

这个代码其实也很简单,和前面的长的差不多,就是找的目标数据后,进行新节点插入

int tailDtaNodeLinkList(struct Link *head,const int targetData,const int data)
{struct Link *prev = head;struct Link *new = (struct Link*)malloc(sizeof(struct Link));new->data = data;new->next = NULL;int cnt = 1;while (prev!= NULL){if(prev->data == targetData){new->next = prev->next;prev->next = new;return cnt;}cnt++;prev = prev->next;}puts("数据插入失败");return -1;
}

函数的参数1为头节点的地址,参数2为目标节点的数据,参数3为新节点的数据 

尾插法的代码 

#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]);}
}/*参数1 结构体指针头节点的地址,参数2第几个节点后插入数据,参数3要插入的数据*/
int tailInsertNodeLinkList(struct Link * head,const int size,const int data)
{struct Link *prev = head;int cnt = 1;struct Link *new = (struct Link*)malloc(sizeof(struct Link ));new->next = NULL;new->data = data;while (NULL != prev){if(cnt == size){new->next = prev->next;prev->next = new;return 1;}cnt++;prev = prev->next;}return -1;
}int tailDtaNodeLinkList(struct Link *head,const int targetData,const int data)
{struct Link *prev = head;struct Link *new = (struct Link*)malloc(sizeof(struct Link));new->data = data;new->next = NULL;int cnt = 1;while (prev!= NULL){if(prev->data == targetData){new->next = prev->next;prev->next = new;return cnt;}cnt++;prev = prev->next;}puts("数据插入失败");return -1;
}int main()
{struct Link head = {1,NULL};int size = 0;puts("请输入你要在链表尾部插入的数据数目");scanf("%d",&size);printf("请按要求输入%d个数据\n",size);tailInsertLinkListPro(&head,size);tailDtaNodeLinkList(&head,2,5);PrintLink(&head);return 0;
}

 好了,尾插法就先讲到这里了,如果有什么不太理解或者我写错的,欢迎来一起讨论 

这篇关于P6 链表 插入数据节点 尾插法指定节点插入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/448756

相关文章

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L