数据结构-2.7.单链表的查找与长度计算

news2024/11/14 14:09:53


注:本文只探讨"带头结点"的情况(查找思路类似循环找到第i-1 个结点的代码)

一.按位查找:

1.代码演示:

版本一:
#include<stdio.h>
#include<stdlib.h> 
​
​
//定义单链表结点类型
typedef struct LNode  
{
    int data; //每个结点存放一个数据元素
    struct LNode *next; //指针指向下一个结点      
}LNode,*LinkList;
​
​
//初始化一个单链表(带头结点)
bool InitList(LinkList &L)
{
    L = (LNode *)malloc( sizeof(LNode) ); //分配一个头结点
    if(L==NULL) //代表内存不足,分配失败-->意味着带头结点的单链表无法创建 
    {
        return false;
    }
    else
    {
        L -> next = NULL; //头结点之后暂时还没有节点,所以指向NULL
        return true; 
    } 
} 
​
​
//判断单链表是否为空(带头结点)
bool Empty(LinkList L)
{
    if(L->next==NULL) //头结点之后如果指向NULL,代表没有数据 
    {
        return true;
    }
    else
    {
        return false;
    }
} 
​
​
//按位查找,返回第i个元素(带头结点即第0个结点)
LNode * GetElem(LinkList L,int i)
{
    if(i<0)
    {
        return NULL;
    }
    LNode *p; //指针p指向当前扫描到的结点 
    int j=0; //当前p指向的是第几个结点:j为0代表头结点 
    p=L; //L指向头结点,头结点是第0个结点(不存数据)
    while(p!=NULL && j<i) //循环找到第i个结点 
    {
        p = p->next;
        j++;
    }  
    return p; 
} 
 
​
int main()
{
    //声明一个指向单链表的指针
    LinkList L;
    //初始化一个空表
    InitList(L); 
    return 0;
} 
版本二:王道书版本
#include<stdio.h>
#include<stdlib.h> 
​
​
//定义单链表结点类型
typedef struct LNode  
{
    int data; //每个结点存放一个数据元素
    struct LNode *next; //指针指向下一个结点      
}LNode,*LinkList;
​
​
//初始化一个单链表(带头结点)
bool InitList(LinkList &L)
{
    L = (LNode *)malloc( sizeof(LNode) ); //分配一个头结点
    if(L==NULL) //代表内存不足,分配失败-->意味着带头结点的单链表无法创建 
    {
        return false;
    }
    else
    {
        L -> next = NULL; //头结点之后暂时还没有节点,所以指向NULL
        return true; 
    } 
} 
​
​
//判断单链表是否为空(带头结点)
bool Empty(LinkList L)
{
    if(L->next==NULL) //头结点之后如果指向NULL,代表没有数据 
    {
        return true;
    }
    else
    {
        return false;
    }
} 
​
​
//按位查找,返回第i个元素(带头结点即第0个结点)
LNode * GetElem(LinkList L,int i)
{
    int j=1; //代表p结点刚开始指向第一个结点(不是头结点) 
    LNode *p=L->next;
    if(i==0)
    {
        return L; //返回头结点 
    }
    if(i<1)
    {
        return NULL;
    }
    while(p!=NULL && j<i) //循环找到第i个结点 
    {
        p = p->next;
        j++;
    }  
    return p; 
} 
 
​
int main()
{
    //声明一个指向单链表的指针
    LinkList L;
    //初始化一个空表
    InitList(L); 
    return 0;
} 

2.返回第0个元素即头结点:

3.返回的结点大于链表的长度:

while循环进行到第5次时p指向NULL,不满足下一次循环条件,跳出while循环,此时返回的p为NULL:代表查找失败

最终可知当i值不合法时即i为负数或者i值大于链表长度时最终都返回NULL,因此只需要判断返回结果是否为NULL即可

得知是否查找成功。

4.返回的结点在链表内:

a.计算时间复杂度需要要查找的元素在合法范围内。

b.平均时间复杂度是指此次输入的i值它取的合法范围内的任何一个数字的概率都等可能的情况,

具体的算法和顺序表的按位查找的分析方法一样。

5.封装:

案例一:GetElem用来获取第i个结点,传入参数i-1即可找到第i-1个结点

案例二:后插操作的加入

右下角的InsertNextNode函数中需要一个if(p==NULL)进行是否为空指针的判断,因为如果传入GetElem函数的i值不合法即i-1也不合法,会导致p为NULL即空指针:


二.按值查找:

1.代码演示:

按值查找操作只能从第一个结点开始循环依次向后查找:

#include<stdio.h>
#include<stdlib.h> 
​
​
//定义单链表结点类型
typedef struct LNode  
{
    int data; //每个结点存放一个数据元素
    struct LNode *next; //指针指向下一个结点      
}LNode,*LinkList;
​
​
//初始化一个单链表(带头结点)
bool InitList(LinkList &L)
{
    L = (LNode *)malloc( sizeof(LNode) ); //分配一个头结点
    if(L==NULL) //代表内存不足,分配失败-->意味着带头结点的单链表无法创建 
    {
        return false;
    }
    else
    {
        L -> next = NULL; //头结点之后暂时还没有节点,所以指向NULL
        return true; 
    } 
} 
​
​
//判断单链表是否为空(带头结点)
bool Empty(LinkList L)
{
    if(L->next==NULL) //头结点之后如果指向NULL,代表没有数据 
    {
        return true;
    }
    else
    {
        return false;
    }
} 
​
​
//按值查找,找到数据域等于e的结点
LNode * LocateElem(LinkList L,int e)
{
    LNode *p= L->next; //L代表头结点,L->next就是第一个节点,此时p就是第一个结点 
    //从第一个结点开始查找数据域为e的结点(头结点不存数据,所以不从头结点开始)
    while(p != NULL && p->data != e)
    {
        p = p->next;
    }
    //找到后返回该节点指针,否则返回NULL
    return p; 
} 
 
​
int main()
{
    //声明一个指向单链表的指针
    LinkList L;
    //初始化一个空表
    InitList(L); 
    return 0;
} 

平均时间复杂度为O(n)。

2.图解:

例一:

p为第一个节点,第一次循环时p不为NULL且p内部的值不为8,符合循环条件,指向p = p->next即向后指一个元素:

第二次循环时p内部的值为8,不符合循环条件,跳出while循环:

例二:

最终返回NULL,代表不存在数据域为6的结点。

3.如果要找的数据域元素不是基本数据类型如结构体类型,就需要复杂的判断:

如结构体(struct)类型要用到运算符"."访问每一个成员变量来比较。


三.求单链表的长度:


四.总结:


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

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

相关文章

契约锁与您相约2024新疆数字经济创新大会暨新疆数字丝路博览会

9月20日&#xff0c;由新疆数字经济联合会主办&#xff0c;多家行业协会及企业共同承办的“2024(第一届)新疆数字经济创新发展大会暨新疆数字丝路博览会”在新疆国际会展中心盛大开幕&#xff0c;活动期间&#xff0c;契约锁作为电子签章行业领先的服务商携数字可信系列产品亮相…

自然语言处理-基于注意力机制的文本匹配

背景&#xff1a; 任务三&#xff1a;基于注意力机制的文本匹配 输入两个句子判断&#xff0c;判断它们之间的关系。参考ESIM&#xff08;可以只用LSTM&#xff0c;忽略Tree-LSTM&#xff09;&#xff0c;用双向的注意力机制实现。 参考 《神经网络与深度学习》 第7章 Reaso…

MT6765/MT6762(R/D/M)/MT6761(MT8766)安卓核心板参数比较_MTK联发科4G智能模块

联发科Helio P35 MT6765安卓核心板 MediaTek Helio P35 MT6765是智能手机的主流ARM SoC&#xff0c;于2018年末推出。它在两个集群中集成了8个ARM Cortex-A53内核&#xff08;big.LITTLE&#xff09;。四个性能内核的频率高达2.3GHz。集成显卡为PowerVR GE8320&#xff0c;频率…

统一网关--gateway(仅供自己参考)

1、网关的概念&#xff1a; 2、网关的功能&#xff1a; &#xff08;1&#xff09;&#xff1a;身份认证和权限校验 &#xff08;2&#xff09;&#xff1a;服务路由&#xff08;具体的业务路由到具体的服务&#xff09;&#xff0c;负载均衡&#xff08;多台服务的话&#xff…

【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study 专栏&#xff1a;用Java学习数据结构系列 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff…

鸿蒙OpenHarmony【轻量系统内核通信机制(消息队列)】子系统开发

消息队列 基本概念 消息队列又称队列&#xff0c;是一种任务间通信的机制。消息队列接收来自任务或中断的不固定长度消息&#xff0c;并根据不同的接口确定传递的消息是否存放在队列空间中。 任务能够从队列里面读取消息&#xff0c;当队列中的消息为空时&#xff0c;挂起读…

英飞凌 PSoC6 评估板 CAPSENSE 触摸滑条应用示例

PSoC™ 62 with CAPSENSE™ evaluation kit 开发板&#xff08;以下简称 PSoC 6 RTT 开发板&#xff09;是英飞凌&#xff08;Infineon&#xff09;联合 RT-Thread 发布一款面向物联网开发者的 32 位双核 MCU 开发套件&#xff0c;其默认内置 RT-Thread 物联网操作系统。本文主…

EasyExcel的基本使用——Java导入Excel数据

使用EasyExcel导入Excel数据有两种方式 无论哪种方式我们都需要建立Excel表格和Java对象的绑定 首先我们需要根据Excel表头定义一个对应的类 excel表示例&#xff1a; 对应的类&#xff1a; 使用ExcelProperty将excel列名和字段名绑定&#xff0c;括号里面填列名 package co…

【Node.js Vue】还在为选什么乐器发愁?乐器推荐系统帮你解决难题,基于用户行为分析的智能推荐,让你不再为音乐器材烦恼

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

家庭聚餐:用白酒传递亲情与温暖

在这个快节奏的社会里&#xff0c;家庭聚餐成为了一种难得的团聚时光。在这样的场合&#xff0c;一杯豪迈白酒&#xff08;HOMANLISM&#xff09;往往能够成为亲情的纽带&#xff0c;传递着温暖与爱意。今天&#xff0c;我们就来谈谈在家庭聚餐中&#xff0c;如何通过豪迈白酒来…

docker部署mybatis在线生成(网页版)

使用docker下载镜像 docker pull tanghc2020/gen启动命令 docker run --name gen --restartalways -p 6969:6969 -d tanghc2020/gen启动后页面 请求地址 http://localhost:6969/#/dashboard sql 脚本 CREATE DATABASE IF NOT EXISTS gen DEFAULT CHARACTER SET utf8 D…

TPDO触发条件如何满足?

在上一期中&#xff0c;我们了解到TPDO&#xff08;传输过程数据对象&#xff09;的传输类型有很多种&#xff1a;同步周期性传输、RTR&#xff08;远程传输请求&#xff09;以及异步制造商特定事件等。这些类型的触发条件主要分为三种&#xff1a;同步&#xff08;SYNC&#x…

PCL 读取txt格式点云并可视化

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 1.1原理 TXT格式的点云文…

高德地图JS API AMap.MouseTool绘制

fang &#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 高德AMap专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#…

基于SpringBoot的校园二手商品交易平台的设计与实现

文未可获取一份本项目的java源码和数据库参考。 一、课题研究背景意义及现状 1.课题背景 随着社会的发展&#xff0c;低碳经济生活已成为当今世界发展的主题&#xff0c;物品循环利用、回收再造成为了社会关注的焦点。调查发现&#xff0c;随着大学生购买力的增强&#xff0…

李宏毅结构化学习 02

文章目录 一、上篇博文复习二、Separable Case三、Non-separable Case四、Considering Errors五、Regularization六、Structured SVM七、Cutting Plane Algorithm for Structured SVM八、Multi-class and binary SVM九、Beyond Structured SVM 一、上篇博文复习 图中x表示输入的…

CSS 复合选择器简单学习

目录 1. Emmet 语法 1.1 快速生成 HTML 结构语法 1.2 快速生成 CSS 样式 1.3 格式化工具 2. 调试 2.1 打开调试工具 2.2 使用调试工具 3. 复合选择器 3.1 后代选择器 3.2 子选择器 3.3 并集选择器 3.4 伪类选择器 3.3.1 链接伪类选择器 3.3.2 :focus 伪类选择器 …

C++入门 之 类和对象(下)

目录 一、初始化列表 二、隐式类型转换与explict 三、静态成员——static 四、友元 五、内部类 六、匿名对象 七.对象拷贝时的编译器优化 一、初始化列表 之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有一种方式&…

【重学 MySQL】三十、数值类型的函数

【重学 MySQL】三十、数值类型的函数 基本函数角度与弧度互换函数三角函数指数与对数进制间的转换示例 基本函数 MySQL提供了一系列基本的数值函数&#xff0c;用于处理数学运算和数值转换。以下是一些常用的基本函数及其用法&#xff1a; 函数用法ABS(x)返回x的绝对值。SIGN…

Java 23、JDK 23正式发布!

9月18日消息&#xff0c;Java 23目前已经正式推出&#xff0c;这是继Java 22之后的又一个非长期支持&#xff08;LTS&#xff09;版本&#xff0c;Oracle 对此版本仅提供六个月的支持。 Java 23包含12个新的JEP&#xff08;JDK增强提案&#xff09;&#xff0c;其中包括其中包…