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

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语