数据结构03 链表的基本操作【C++数组模拟实现】

前言:本节内容主要了解链表的基本概念及特点,以及能够通过数组模拟学会链表的几种基本操作,下一节我们将通过STL模板完成链表操作,可以通过专栏进入查看下一节哦~

目录

单链表及其特点

完整链表构成

完整链表简述

创建单链表

定义节点存储结构

尾插法插入元素

遍历并显示链表内容

头插法插入元素

向链表中插入元素

删除元素

查找元素

链表基本操作完整代码


单链表及其特点

链表的种类较多,这里我们主要讲解最常见的带头结点的单链表。

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。


如图所示,链表中每个数据的存储都由以下两部分组成:

1.数据元素本身,其所在的区域称为数据域;

2.指向直接后继元素的指针,所在的区域称为指针域;

完整链表构成

1.头结点:头节点是一个不存储任何数据的结点,是为了方便找到链表位置。

2.首元结点:它是链表中称第一个存有数据的节点为首元结点,称呼没有实际意义。

3.其他结点:链表中其他的结点。

完整链表简述

注意:链表中有头结点时,头指针指向头结点;反之,若链表中没有头结点,则头指针指向首元结点。

简单的来说,链表就像一环扣一环的链子一样,当你想插入删除元素的时候,只需要找到你要插入或者删除的位置,然后解开该位置两边的环,然后将新的环连接上即可。

由于链表的特殊结构,决定了它拥有一个数组所没有的优势,那就是进行插入删除操作的时候,不需要移动元素。但是缺点就是查找元素需要从头结点开始一个一个往后找。

创建单链表

单链表在创建的时候需要先声明结点,方可创建链表,即向链表中插入元素。插入元素时,又可分为头插法和尾插法。头插法和尾插法的区别后面会通过结果展示出来。

头插法:在头结点之后插入数据,其特点是读入的数据顺序与线性表的逻辑顺序正好相反,可用来实现倒序输出一个元素序列。

尾插法:将每次插入的新结点放在链表的尾部。   

定义节点存储结构

struct Node
{int data;    //保存节点中存储的数据Node *next; //指向下一结点
};

尾插法插入元素

void Wcreate(Node *l,int n) //尾插法向链表中插入n个数字
{Node *p,*r; //p用来指向新生成的结点。r始终指向l的终端结点。r=l;     //r指向了头节点,此时的头节点也是终端节点int k;for(int i=0;i<n;i++) {cin>>k;p=new Node; //为结点分配空间p->data=k;  //将数值存入新结点r->next=p;   //接受新的结点r=p;  //r指向终端结点}r->next=NULL; //l的终端结点指针域为NULL,l建立完成
}

遍历并显示链表内容

void show(Node *l)
{Node *p;p=l->next;while(p!=NULL){cout<<p->data<<" ";p=p->next;}cout<<endl;
}

头插法插入元素

void Tcreate(Node *l,int n) //头插法向链表中插入n个数字
{Node *p; //p用来指向新生成的结点l->next=NULL;int k;for(int i=0;i<n;i++) {cin>>k;p=new Node; //为结点分配空间p->data=k;  //将数值存入新结点p->next=l->next;  //将l指向的地址赋值给p;l->next=p; //头指针的指针域next指向p结点,使得p成为开始结点。}
}

向链表中插入元素

void insert(Node *l,int k,int e)//在第k个位置后插入元素e;
{Node *p,*r;r=l;if(r->next==NULL) cout<<"链表为空";for(int i=0;i<k;i++) //找到第k个位置之前的那个位置r=r->next;p=new Node; //为新结点申请空间p->data=e;p->next=r->next;r->next=p;
}

删除元素

void Delete(Node *l,int x) //删除第一个值为x的数。
{Node *r,*pre;pre=l; //记录前驱结点,防止断链r=l->next;while(r->data!=x){pre=r;  //记录该结点前一个结点r=r->next;}pre->next=r->next; //将其前驱next指向其后继,实现删除
}

查找元素

//查找值为X的数是否存在,在则输出第一次出现的位置。
void Search(Node *l,int x) {int k=1;  //记录位置Node *p;p=l->next;while(p->data!=x&&p->next!=NULL) {p=p->next;k++;}if(p->data!=x) cout<<"未找到"<<endl;else cout<<"是第"<<k<<"个数字"<<endl;
}

链表基本操作完整代码

#include<iostream>
using namespace std;
struct Node
{int data;    //保存结点中存储的数据Node *next; //指向下一结点
};void Wcreate(Node *l,int n) //尾插法向链表中插入n个数字
{Node *p,*r; //p用来指向新生成的节点。r始终指向l的终端节点。r=l;     //r指向了头节点,此时的头节点也是终端节点int k;for(int i=0;i<n;i++) {cin>>k;p=new Node; //为节点分配空间p->data=k;  //将数值存入新节点r->next=p;   //接受新的节点r=p;  //r指向终端节点}r->next=NULL; //l的终端节点指针域为NULL,l建立完成
}void Tcreate(Node *l,int n) //头插法向链表中插入n个数字
{Node *p; //p用来指向新生成的结点l->next=NULL;int k;for(int i=0;i<n;i++) {cin>>k;p=new Node; //为结点分配空间p->data=k;  //将数值存入新结点p->next=l->next;  //将l指向的地址赋值给p;l->next=p; //头指针的指针域next指向p结点,使得p成为开始结点。}
}void show(Node *l)
{Node *p;p=l->next;while(p!=NULL){cout<<p->data<<" ";p=p->next;}cout<<endl;
}void Search(Node *l,int x) //查找第一个值为X的数是否存在。
{int k=1;  //记录位置Node *p;p=l->next;while(p->data!=x&&p->next!=NULL){p=p->next;k++;}if(p->data!=x) cout<<"未找到"<<endl;else cout<<"是第"<<k<<"个数字"<<endl;
}int main()
{Node *L; //数据第一个数字位置是0L=new Node;L->next=NULL;int n,x,m;cin>>n;Wcreate(L,n);cout<<"尾插法插入结果:";show(L);/*Tcreate(L,n);cout<<"头插法插入结果:";show(L);cout<<"\n请输入插入的位置及元素值:"<<endl;cin>>m>>x;Insert(L,m,x);show(L);cout<<"\n请输入要删除的数值:"<<endl;cin>>x;Delete(L,x);show(L);*/cout<<"\n请输入要查找的数值:"<<endl;cin>>x;Search(L,x);return 0;
}

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

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

相关文章

京东云备案流程图_云主机快速ICP备案_京东云服务器备案问题解答

京东云ICP备案流程&#xff0c;备案包括网站和APP备案&#xff0c;以及备案问题解答FAQ&#xff0c;阿腾云以京东云网站域名备案流程为例&#xff0c;先填写主办单位信息&#xff0c;选择网站备案或APP备案&#xff0c;申请授权码并验证&#xff0c;填写并上传主办单位详细信息…

【论文解读】Video Coding with Cross-Component Sample Offset

论文下载地址:Video Coding with Cross-Component Sample Offset 时间:2024 年 作者:Han Gao、Xin Zhao、Tianqi Liu和Shan Liu 级别:《IEEE Transactions on Image Processing》 机构:Tencent America 摘要 研究背景:传统的图像和视频压缩技术主要探索空间、时间和主观…

Python入门-基本数据类型-数字类型的操作

1.数字运算符 数字运算符是一些特殊的符号&#xff0c;主要用于数字之间的运算。根据功能可以将数字运算符分为算 术运算符、赋值运算符等。 1.1算术运算符 Python的算术运算符有“”“-”“*”“/”“%”“**”和“//”&#xff0c;这些都是双目运算符&#xff0c;用于对两…

光伏仿真软件是什么?都有哪些功能?

光伏仿真软件&#xff0c;作为现代光伏系统设计的重要工具&#xff0c;正日益受到设计师、工程师和决策者的青睐。它结合了物理学、工程学和计算机科学的原理&#xff0c;以数字化方式模拟光伏系统的运行&#xff0c;帮助用户预测和优化系统的性能。本文将详细探讨光伏仿真软件…

IntelliJ IDEA介绍

IntelliJ IDEA 是由 JetBrains 开发的一个集成开发环境 (IDE),专门为 Java 开发设计,同时也支持多种其他编程语言和框架。IntelliJ IDEA 以其智能代码分析、强大的重构功能以及丰富的插件生态系统而闻名,是许多开发者的首选 IDE。 IntelliJ IDEA介绍 IntelliJ IDEA 的主要…

发布一个Yii2扩展把debug信息存储到MongoDB中

这里写自定义目录标题 Yii 2 Debug For MongoDB目录结构安装依赖安装说明配置说明 Yii 2 Debug For MongoDB 本项目为yii2-debug的扩展&#xff0c;使用MongoDB对debug数据进行存储。如果使用Yii2进行多个应用的开发的话&#xff0c;把debug信息汇聚到一起可以方便查阅。 http…

[Go 微服务] go-micro + consul 的使用

文章目录 1.go-micro 介绍2.go-micro 的主要功能3.go-micro 安装4.go-micro 的使用4.1 创建服务端4.2 配置服务端 consul4.3 生成客户端 5.goodsinfo 服务5.1 服务端开发5.2 客户端开发 1.go-micro 介绍 Go Micro是一个简化分布式开发 的微服务生态系统&#xff0c;该系统为开…

Java学习【IO流:深入理解与应用(上)】

Java学习【IO流&#xff1a;深入理解与应用&#xff08;上&#xff09;】 &#x1f343;1.IO流体系结构&#x1f343;2.FileOutputStream&#x1f341;2.1FileOutputStream写数据的三种方式&#x1f341;2.2换行和续写 &#x1f343;3.FileInputStream&#x1f341;3.1每次读取…

软考高项备考经验分享

高项备考经验分享 在备考被论文卡两次后&#xff0c;这次终于通过了高项&#xff0c;分不是很高&#xff0c;比较幸运&#xff0c;对这次考试做个总结与分享&#xff0c;希望对同学们有所帮助。 1、备考时间 首先备考时间上不建议拉的太长&#xff0c;每天坚持看书3~6个月时…

《编译原理》阅读笔记:p25-p32

《编译原理》学习第 5 天&#xff0c;p25-p32总结&#xff0c;总计 8 页。 一、技术总结 1.lexical lexical这个单词后续会经常用到&#xff0c;所以首先要搞懂它的英文意思&#xff0c;不然看到中文的“词法&#xff0c;语法&#xff0c;文法”这三个词的时候就会懵了——l…

异常实践1

只针对不正常的情况才使用异常 异常只应该被用于不正常的条件&#xff0c;它们永远不应该被用于正常的控制流。《阿里手册》中&#xff1a;【强制】Java 类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch 的方式来处理&#xff0c;比如&#xff1a;Nu…

Java实现 现场评委给参赛选手打分的过程

通过评委的积极参与和公正评分,可以提高评选活动的公信力和可信度。 透明性:参赛者和观众应该清楚了解评审标准和评分过程,以便能够理解评委的评判依据。 可靠性:评委评分应该具有一致性和可靠性,不受主观因素或随机误差的影响。 编写程序&#xff0c;Java代码实现&#xff1…

计算机组成原理:海明校验

在上图中&#xff0c;对绿色的7比特数据进行海明校验&#xff0c;需要添加紫色的4比特校验位&#xff0c;总共是蓝色的11比特。紫色的校验位pi分布于蓝色的hi的1, 2, 4, 8, 16, 32, 64位&#xff0c;是2i-1位。绿色的数据位bi分布于剩下的位。 在下图中&#xff0c;b1位于h3&a…

Redis分布式锁详解:原理、实现与最佳实践

Redis分布式锁详解&#xff1a;原理、实现与最佳实践 引言 在分布式系统中&#xff0c;经常需要对共享资源进行同步访问&#xff0c;以避免并发问题。Redis分布式锁提供了一种简单而高效的方式来实现这一需求。本文将深入探讨Redis分布式锁的工作原理、实现方法以及在实际应用…

人工智能给文化安全带来挑战

技术发展的双刃剑特性在人工智能时代尤为明显。基于人工智能的算法权力代表了新的权力结构&#xff0c;依托这些算法的平台正在逐渐形成一种能够单方面施加影响的新势力。由于算法技术的复杂性和专业性&#xff0c;加之公共权力机构在授权和监管上的不足&#xff0c;以及当前对…

资料分析题目类型分类

1、两期平均数比较问题&#xff08;类比为两期比重比较问题&#xff09; 例如&#xff1a;2020年&#xff0c;H省秋粮玉米和稻谷的市场平均交易价格分别为2.34元/公斤和2.74元/公斤&#xff0c;分别比上年上涨28.6%和8.7%。按此价格测算&#xff0c;2020年全省农户种植玉米、稻…

浅谈安科瑞ACRELCLOUD-1200光伏发电系统在建筑节能中的应用

摘要&#xff1a;21世纪以来&#xff0c;随着不可再生能源的逐渐减少&#xff0c;人们越来越重视能源的利用率&#xff0c;不断开发绿色能源。通过光伏发电系统&#xff0c;能够提升能源利用率&#xff0c;减少不可再生能源的开发。同时&#xff0c;也能加强我国建筑节能系统的…

【React】第二个组件的一点小问题(JSX元素需要被包裹)

能看出为什么报错吗&#xff1f; 它告诉我们JSX元素需要被包裹&#xff0c;此时只需在所有元素外套一层标签&#xff08;空标签也可以哦&#xff09; 专业点就是要有一个根元素 注释&#xff1a; ctrl / 效果是 {/* */}这样 三元运算符&#xff1a;同CPP 循环输出数组&#x…

每日一道算法题 面试题 08.08. 有重复字符串的排列组合

题目 面试题 08.08. 有重复字符串的排列组合 - 力扣&#xff08;LeetCode&#xff09; Python class Solution:def permutation(self, S: str) -> List[str]:# 以索引记录字符是否用过lelen(S)idx[_ for _ in range(le) ]# 组合得到的字符串combine[]*leans[]# 递归def fu…

Go 中使用map时注意的问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…