数据结构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;填写并上传主办单位详细信息…

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

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

[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…

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…

浅谈安科瑞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的主页」…

面对资质申请被拒,河南企业如何调整策略再次冲刺?

当乙级风力发电资质申请未通过时&#xff0c;不必过于焦虑&#xff0c;以下是一份详细的二次申请攻略&#xff0c;帮助你更有条理地准备和提交申请&#xff1a; 一、失败原因分析与总结 查询评审意见&#xff1a;在收到评审结果后&#xff0c;首先查询并仔细阅读专家评审意见&…

利用python爬取上证指数股吧评论并保存到mongodb数据库

大家好&#xff0c;我是带我去滑雪&#xff01; 东方财富网是中国领先的金融服务网站之一&#xff0c;以提供全面的金融市场数据、资讯和交易工具而闻名。其受欢迎的“股吧”论坛特别适合爬取股票评论&#xff0c;东方财富网的股吧聚集了大量投资者和金融分析师&#xff0c;他们…

vue开发网站--关于window.print()调取打印

1.vue点击按钮调取打印 点击按钮&#xff1a; 调取打印该页面&#xff1a; <div click"clickDown()">下载</div>methods: {//下载-调取打印clickDown() {window.print()}, }<style>/* 点击打印的样式 */media print {.clickDown {display: no…

推荐一款免费的GIF编辑器——【ScreenToGif编辑器】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️木道寻的主页 文章目录 &#x1f525;前言&#x1f680;素材准备&#x1f680;逐帧制作&#x1f680;保存图片⭐️⭐️⭐️总结 &#…

【吊打面试官系列-MyBatis面试题】MyBatis 框架适用场合?

大家好&#xff0c;我是锋哥。今天分享关于 【MyBatis 框架适用场合 &#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MyBatis 框架适用场合&#xff1f; 1、MyBatis 专注于 SQL 本身&#xff0c;是一个足够灵活的 DAO 层解决方案。 2、对性能的要求很高&#…

Java | Leetcode Java题解之第191题位1的个数

题目&#xff1a; 题解&#xff1a; public class Solution {public int hammingWeight(int n) {int ret 0;while (n ! 0) {n & n - 1;ret;}return ret;} }

MySQL之如何分析慢查询

1、一个SQL语句执行很慢&#xff0c;如何分析&#xff1f; 可使用“explain”或者“desc”命令获取MySQL如何执行select语句的信息。 语法&#xff1a;直接在select语句前加关键字 explain或desc explain select job_desc from xxl_job_info where id 1; 2、执行计划中五个重…

【涵子来信】——社交宝典:克服你心中的内向,世界总有缺陷

内向&#xff0c;你是内向的吗&#xff1f;想必每个人不同&#xff0c;面对的情形也是不同的。 暑假是一个很好的机会&#xff0c;我是可以去多社交社交。但是&#xff0c;面对着CSDN上这么多技术人er&#xff0c;那么&#xff0c;我的宝典&#xff0c;对于大家&#xff0c;有…