P4 链表的节点数统计与链表数据查找替换

目录

前言  

01 链表的节点数统计

02 链表数据查找替换 

2.1 残疾的数据查找

2.2 数据查找优化


前言  

                                

🎬 个人主页:@ChenPi

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

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

📝推荐专栏3: ​​​​​​《链表_@ChenPi的博客-CSDN博客》 ✨✨✨
🍉本篇简介  :  使用代码的形式演示链表与数组的区别

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

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

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

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

这章我们讲链表的节点数统计与链表数据查找替换 

上章代码

#include <stdio.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 main()
{struct Link link1 ={1,NULL};struct Link link2 ={2,NULL};struct Link link3 ={3,NULL};link1.next = &link2;link2.next = &link3;link3.next = NULL;PrintLink(&link1);return 0;
}

01 链表的节点数统计

统计链表的节点个数,其实这个就很简单,和上一章的遍历输出是一个道理,我们拿上面的代码改一下。

我们现在要统计节点数,那可能要用到这个节点的数目,所以我们定义一个int 返回型的函数

int GetLinkNum(struct Link *head)
{}

然后我们需要个整形数记录节点数

所以int count = 0;

我们就用count记录节点的数目,然后遍历,while每循环一次,count++

int GetLinkNum(struct Link *head)
{struct Link *prev = head;int count = 0;while (prev != NULL){count++;prev = prev->next;}return count;
}

大概就是这样了,最后返回的是链表的节点数目 

02 链表数据查找替换 

2.1 残疾的数据查找

刚刚我们实现了统计链表的节点数,现在我们尝试一下通过遍历查找数据是否存在,我们先思考一下,查找函数,如果我们找到了数据,我们想做什么呢?

我们可以试着让它返回0或1,0为未找到数据 1则找到数据,如果可以的话,可以写成宏定义,TURE或FLASE

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

我们定义个函数,函数名为findLinkData,返回值类型为int,我们让链表进行遍历

然后if语句查找data,如果有相同的数据则返回1,否则链表遍历到链表尾也没有相同的数据的话,那就返回0 

 可以看到,函数是可以找到查找需要的数据的

但是代码还是有点残疾,比如我链表好多个数据都是2呢?

那它找到最近的就返回了,那怎么行呢?

2.2 数据查找优化

现在我不单单要查找数据,还要将数据和所在节点号输出来,如何做到呢?

其实节点号的话直接在结构体里多加一项数据记录每个节点的节点号也可以,但我们

在案例就不那么做了

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

这个是函数体,首先我的方法是,当找到需要查找的数据时,我定义一个数组来接收节点号,并保存下来,当遍历完链表后,我在统一输出来

 

现在我定义了四个节点,其中2和4的数据为2,然后我让FindLinkDataPro进行查找

 

可以看到,没有任何问题,还有就是数据的替换了,其实更简单了,我们到都能找到了,那么直接将内存写入的输入重新写入就好,所以就不讲解了,如果需要讲解的话可以私信我

例题源码

#include <stdio.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 main()
{struct Link link1 ={1,NULL};struct Link link2 ={2,NULL};struct Link link3 ={3,NULL};struct Link link4 ={2,NULL};link1.next = &link2;link2.next = &link3;link3.next = &link4;link4.next = NULL;PrintLink(&link1);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.mzph.cn/news/189640.shtml

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

相关文章

Java集合(二)

1. Map 1.1 HashMap 和 Hashtable 的区别 线程是否安全&#xff1a; HashMap 是非线程安全的&#xff0c;Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。&#xff08;如果你要保证线程安全的话就使用 ConcurrentHashMap 吧&#xff01;&…

Yocto - bb脚本中使用的SRC_URI、SRCREV和S

我们遇到的各种自己不了解的技术或产品时&#xff0c;都需要阅读用户手册。用户手册里的内容很多时&#xff0c;除了由目录组织文档结构外&#xff0c;通常还有有一个词汇表&#xff0c;一般作为附录放在文档最后。 通过这个按照字母排序的词汇表&#xff0c;可以在对整个文档还…

C#,数值计算——插值和外推,谢别德(Shep)插值方法的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 谢别德插值方法 /// Object for Shepard interpolation using n points in dim dimensions. Call /// constructor once, then interp as many times as desired. /// &…

前端面试提问(3)

1、js两个数相加会不会丢精度&#xff1f; 可能会遇到精度丢失的问题。JavaScript 使用的是 IEEE 754 浮点数标准&#xff0c;即一种二进制表示法&#xff0c;有时不能准确地表示十进制小数。如果你需要进行精确的十进制数值计算&#xff0c;可以使用一些处理精确数值的库&…

4.C转python

1.建立函数: def 函数名(形参): 函数体(记得写缩进) return 返回值(python中可以没有return) 2.调用函数: 函数名(实参) 实参和形参个数相等即可,类型不需要相同 其中接收返回值与C中的差不多 3.如果只是定义而不调用则函数不会执行 4.先定义函数,后调用 5.python中可以…

每天五分钟计算机视觉:ImageNet大赛的世界冠军AlexNet模型

AlexNet模型 2012 Imagenet 比赛第一&#xff0c;Top5准确度超出第二10% &#xff0c;它让人们认识到了深度学习技术的威力。比 LeNet更深&#xff0c;用多层小卷积层叠加替换大卷积层&#xff0c;就是说每一个卷积层的通道数小&#xff0c;不像LeNet一样每个卷积层的通道数很大…

记录华为云服务器(Linux 可视化 宝塔面板)-- 防火墙篇

文章目录 前言安装防火墙防火墙设置防火墙操作1.设置开机启动防火墙2.查看防火墙开放哪些端口3.重载防火墙配置&#xff08;修改配置后重新启动才生效&#xff09;4.查看防火墙状态5.开启防火墙6.关闭防火墙 若遇到无法开启查询已开放的端口查询端口是否开放&#xff08;80&…

简单了解设计模式

常见的设计模式大致可以分为三个主要类别&#xff1a;创建型、结构型和行为型。以下是这三个类别下的各种模式&#xff1a; 创建型模式 (Creational Patterns)&#xff1a;这类模式主要关注如何创建对象。 单例模式 (Singleton)&#xff1a;确保某一个类只有一个实例&#xff0…

在内网开发中使用Nginx代理来访问钉钉新版服务端API

如果你在内网开发中使用Nginx代理来访问钉钉新版服务端API&#xff0c;你可以在Nginx配置文件中进行相应的配置。 以下是一个简单的示例Nginx配置&#xff0c;用于将对指定URL的请求代理到钉钉服务端API&#xff1a; server { listen 80; server_name your_server_domain; l…

Python爬虫-新能源汽车销量榜

前言 本文是该专栏的第11篇,后面会持续分享python爬虫案例干货,记得关注。 本文以懂车平台的新能源汽车销量榜单为例,获取各车型的销量排行榜单数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。 废话不多说,跟着笔者直接往下看正文详细内容。(附带…

FFMPEG编译安装、简单使用

目录 源码下载编译和安装API简单使用源代码编译运行 工具的简单使用学习论坛 源码下载 地址: https://github.com/FFmpeg/FFmpeg git clone https://github.com/FFmpeg/FFmpeg.git编译和安装 因为使用在板端编译&#xff0c;因此没有使用交叉编译链的部分。将如下内容复制到…

电梯安全远程监控系统的主要作用和意义

电梯是现代城市生活中必不可少的交通工具&#xff0c;为了保证其安全可靠的运行&#xff0c;电梯运行监测系统应运而生。本文将介绍电梯安全远程监控的工作原理、重要性 一、电梯安全远程监控系统的作用   ◆实时监控和故障预警&#xff1a;电梯安全远程监控系统可以实时监测…

加强网站稳定性!学习如何进行高效压力测试!

前言 1、什么是压力测试&#xff1f; 软件压力测试是一种基本的质量保证行为&#xff0c;它是每个重要软件测试工作的一部分。 软件压力测试的基本思路很简单&#xff1a;不是在常规条件下运行手动或自动测试&#xff0c;而是在计算机数量较少或系统资源匮乏的条件下运行测试…

Pandas进阶:文本处理

引言 文本的主要两个类型是string和object。如果不特殊指定类型为string&#xff0c;文本类型一般为object。 文本的操作主要是通过访问器str 来实现的&#xff0c;功能十分强大&#xff0c;但使用前需要注意以下几点。 访问器只能对Series数据结构使用。 除了常规列变量df.c…

从0开始学习JavaScript--JavaScript 集成测试

JavaScript集成测试是确保整个应用程序组件协同工作的关键环节。通过模拟真实环境&#xff0c;集成测试能够发现不同组件之间的潜在问题&#xff0c;确保系统的稳定性和可靠性。本文将深入探讨JavaScript集成测试的核心概念、工具使用以及最佳实践&#xff0c;并通过丰富的示例…

springboot多文件上传

Spring Boot 是一个强大的、灵活的、开发效率高的框架&#xff0c;适合开发各种类型的 Web 应用或微服务&#xff0c;是现代化的企业级开发的首选。 接口编写 可以使用Spring Boot的MultipartResolver来实现上传多文件。 在pom.xml文件中添加以下依赖&#xff1a; <depende…

1.2 Ubauntu 使用

一、完成VMware Tools安装 双击 VMwareTool 打开 Ubuntu 终端快捷键 AltControlT 切换汉语的快捷键是Alt空格 ls 打印出当前所在目录中所有文件和文件夹 cd 桌面 进入桌面文件夹 sudo ./vmware-install.pl 安装tool&#xff0c;输入之前设置的密码。 地址默认&#xff0c;按…

华为OD机试真题-CPU算力分配-2023年OD统一考试(C卷)

题目描述: 现有两组服务器A和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能力,B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换,求两组服务器中,用于交换的CPU的算力,…

UI自动化测试工具有哪些优势?

UI自动化测试工具通过提高测试效率、覆盖率&#xff0c;减少测试时间和成本&#xff0c;以及支持持续集成等方式&#xff0c;为软件开发团队提供了一系列重要的优势&#xff0c;有助于提升软件质量和开发效率。 自动化执行&#xff1a;UI自动化测试工具可以模拟用户与应用程序的…

HarmonyOS脚手架:UI组件之文本和图片

前言 关于HarmonyOS脚手架&#xff0c;本篇是系列的第二篇&#xff0c;主要实现UI组件文本和图片的常见效果查看&#xff0c;本身功能特别的简单&#xff0c;其目的也是很明确&#xff0c;方便大家根据效果查看相关代码实现&#xff0c;可以很方便的进行复制使用&#xff0c;当…