线性表:关于链表(主要以单链表为例)的相关理解和应用

多清澈这天空 晴雨相拥 同心逐梦!

坚守我信心  一路出众!!

首先,按照惯例,欢迎大家边听歌边观看本博客

▶ 紫荆花盛开 (163.com)(建议复制链接,浏览器打开,csdn打开太慢了)

2022香港回归祖国25周年主题歌曲,好听!!!

一.单链表

首先 大家肯定知道链表的表达方式,如下

typedef struct LNode
{ElemType data;struct LNode *next;}LinkNode;

定义一个LNode,node节点,结点,L是link,表示链接,所以叫做LNode链接结点构成链表

第一个存放元素的信息,链表的特点就是多存了一个节点(指针域)指向后继节点。

0.1稍微浅浅的给大家补充一下结构体的知识点:

1.一个正常的结构体代码编写

struct
{
int num;
char name[20];
char sex;
float score;
}boy1,boy2;

你可以直接在boy2后面打个{ }初始化,在使用boy的时候我们可以具体到一个成员如boy1.num 即为boy1结构体的num成员

然后接下来其实更加常见的定义是这样子的

struct stu
{
int num;
char name[20];
char sex;
float score;
}*boy1,boy2; //boy1是结构体指针,boy2是结构体

这时候我们对指向结构体的指针标表示的成员方式有所不同,可表示为(*boy1).num或者boy1->num(熟悉吧,这里算是补充一下知识点)都可以。一般配合malloc(与free)或者c++中的new(delete)函数使用,主要是结构体指针自创立开始指向的空间就不存在,所以我们得开辟一个空间给他们. 

1.1理解一些易混概念

        本来吧,其实我真想按课本讲一遍,但是感觉有点浪费时间,而且课本那些加深不了我的理解,所以干脆我就直接把我的理解说了,如果有错,希望各位大佬指正!

温馨提示:接下来的话可能有点绕口令!!

第一:节(结)点

我们知道一个节点包括了他的数据域和他的指针域

数据域存放他的data,指针域存放下一个节点的地址,其中在第一个的叫做头结点,头结点链接的第一个节点叫做首节点,最后一个节点叫做尾结点。经常会出现R指针,我管他叫标记指针,用于记住我们要操作的节点的下一个地址,免得链表丢失,至少现在我知道的就是这点,其中^表示NULL。

ok,接下来,来解决几个知识,保证我们看得到接下来的代码,懂了应该就会写了吧

1.对指针赋值相当于就是让指针指向哪里

1.1:比如Lode *r=L;让r指向头结点L。

1.2:pre=p;(pre和p都是指针),让pre指向p(指向的地址)

1.3:p=p->next p指向下一位(详细一点:p->next在等号后面表示解引用,指的是p指向的结构体的指针域的地址(表示这个结构体的下一个地址))

1.4:r->next=p 这个指的是让r对应的结构体指向p(而非指针r指向p,此时的r相当于标记指针)

1.5:s->next=p->next;p->next=s;像这种我们就推荐画图理解

1.6:p=L->next->next表示p指向L的下下指针域而L->next->next=NULL则指的是L的下一个节点的指针域为空,如下图所示

 

 2.链表的基本功能

相信大家已经对链表有了初步的了解,现在我们来一个一个实现他们

2.1链表创建与初始化

typedef char ch
typedef struct LNode
{ch data;struct LNode* next;
}Linknode;
初始化
void InitLnode(LinkNode *&L){
L=new LinkNode;
L->next=NULL;
}

 2.2插入

这里就不得不讲讲插入的两种方法

2.2.1头插法

思路示意图如下:

LinkList Headinster(LinkList &L,int n){LNode *s;int x=1;L= (LinkList)malloc(sizeof(LNode));L->data=x++;L->next=NULL;while(x!=n){s=(LNode*) malloc(sizeof(LNode));s->data=x;s->next=L;L=s;x++;}return L;
}

 

核心代码

s->next=L->next;		①
L->next=s;				②

 作用效果就是从头结点和首节点插入新的元素,从而导致先插进来的反而在后面

这里借用一下大佬的动图(侵权删)

2.2.2尾插法

顾名思义就是从尾部开始插入由于新的节点插入后成为新的尾部,所以我们需要用一个指针R去更新尾部节点(始终指向尾部)

大概像这样子

LinkList TailInster(LinkList &L,int n){int x=1;L= (LinkList)malloc(sizeof(LNode));LNode *s,*r=L;while(x!=n){s=(LNode*) malloc(sizeof(LNode));s->data=x;r->next=s;r=s;x++;}r->next=NULL;return L;
}

核心代码

r->next=s;			//①r的指针域指向S(让新结点插入到链表)
r=s;				//②r指针指向s(保持r指针一直在链表尾端,方便插入新的结点)

 那么 现在我们继续写这个尾插法

//插入(使用尾插法)
void InsertLnode(LinkNode *&L,ch a[],int n)
{LinkNode *s,*r;r=L;for(int i=0;i<n;i++){s=new LinkNode;s->next=a[i];r->next=s;r=s;}    r->next=NULL;
}

2.3链表的展示

void DisplayLinkNode(LinkNode *L)
{LinkNode *p=L->next;while(p!=NULL){cout<<p->data<<"   ";p=p->next;}cout<<endl<<endl;
}

 2.4链表的长度

int LinkNodeLength(LinkNode *L)
{LinkNode *p=L;int n=0;    while(p->next!=NULL)//注意头结点不算我们的链表长度{n++;p=p->next;}return n; 
}

2.5链表中取值

bool Getlink(LinkNode *L,int n,ch &e)
{if(n<=0)return false;LinkNode *p=L;int j=0;while(j<n&&p!=NULL){j++;p=p->next;}if(p==NULL)return false;else{e=p->data;return true;}
}

记忆方法:创建指针,遍历一下,判断是否为空,否则为可取之值 

 2.6链表中删除

bool DeleteNode(LinkNode *&L,int n,ch &e)
{if(n<=0) return false;LinkNode *p=L,q;int j=0;while(j<n-1&&p!=NULL)//注意删除代码停在删除元素的前面{j++;p=p->next;}if(p==NULL)return false;q=p->next;if(q==NULL)return falsee=q->data;p->next=q->next;delete q;return true;  }

记忆方法 建立两个指针,遍历到删除元素的前一个,用p指向删除元素,然后进行交换

2.7新的插入

bool insertnode(LinkNode *&L,int i,ch e)
{if(i<=0)return false;LinkNode *p=L,*s;int j=0;while(j<n&&p!=NULL){j++;p=p->next;}if(p==NULL||p->next==NULL)return false;s=new LinkNode;s->data=e;s->next=p->next;p->next=s;return true;
}

记忆方法:创建一个新节点,类似头插法的方式插进去 

小作业 

#include <iostream>
using namespace std;
typedef char ch;
typedef struct LNode {ch data;struct LNode*next;//指针域:存放下一个节点的地址
} LinkNode;
//初始化
void InitList(LinkNode *&L) {L = new LinkNode;L->next = NULL;
}
//插入(尾插法)
void Insertlist(LinkNode *&L, ch a[], int n) { //传入想插入的数组(1,2,3,4),则此法插完后亦是(1,2,3,4)LinkNode *s, *r; //创建两个指针r = L; //r指向首节点Lfor (int i = 0; i < n; i++) {s = new LinkNode; //创建空间s->data = a[i]; //数据存储(值得注意的是s是指针)r->next = s; //r->next表示L的next指针域,其实就是赋值,将s的地址(s本身就是地址)赋给L的next域,相当于是L--sr = s; //然后将r指向s}r->next = NULL; //最后r指向末节,指针域为NULL
}
//输出
void Displaylist(LinkNode *L) {LinkNode *p = L->next; //这里注意一下,其实首节点是没有数据的,直接指向下一个节点打印while (p != NULL) {cout << p->data << "  ";p = p->next;}cout << endl << endl;
}
//输出长度
int Listlength(LinkNode *L) {int n = 0;LinkNode *p = L;while (p->next != NULL) {n++;p = p->next;}return n;
}
//判断是否为空
bool emptyelem(LinkNode *L) {if (L->next == NULL)return false;elsereturn true;
}
//取值
bool Getelem(LinkNode *L, int n, ch &e) {if (n <= 0)return false;LinkNode *p = L;int j = 0;while (j < n && p != NULL) {j++;p = p->next;}if (p == NULL)return false;e = p->data;return true;
}
//输出位置
int Locelem(LinkNode *L, ch e) {LinkNode *p = L->next;int j = 1;while (p != NULL && p->data != e) {p = p->next;j++;}if (p == NULL) {return 0;}return j;
}
//指定位置插入元素
bool insertlist(LinkNode *&L, int n, ch q) {if (n <= 0)return false;int j = 0;LinkNode *p = L, *s;while (j < n - 1 && p != NULL) {j++;p = p->next;}if (p==NULL||p->next == NULL)return false;else {s = new LinkNode;s->data = q;s->next = p->next;p->next = s;return true;}
}
//删除指定元素
bool Delem(LinkNode *&L, int n, ch &e) {if (n <= 0)return false;int j = 0;LinkNode *p = L, *q;while (j < n - 1 && p != NULL) {j++;p = p->next;}if (p == NULL)return false;q = p->next;if (q == NULL)return false;e = q->data;p->next = q->next;delete q;return true;
}
//释放
void Destroylist(LinkNode *&L) {delete L;
}int main() {LinkNode *L1;InitList(L1);cout << "1.初始化单链表成功!!!" << endl << endl;//插入ch a[10] = {'a', 'b', 'c', 'd', 'e'};cout << "2.依次插入abcde." << "尾插法" << "    ";Insertlist(L1, a, 5);cout << "插入成功!!!" << endl << endl;//打印cout << "3.当前的单链表为:  ";Displaylist(L1);//输出长度int n = Listlength(L1);cout << "4.当前单链表的长度为:" << n << endl << endl;//判断链表是否为空cout << "5.当前链表";if (emptyelem(L1))cout << "不为空表" << endl << endl;elsecout << "为空表" << endl << endl;//取值(输出元素)cout << "6.取值操作:";	int l;ch e;cout << "请输入您要取哪个位置的值:";cin >> l;if (Getelem(L1, l, e))cout << "取值成功! " << "单链表第" << l << "位的元素是:" << e << endl << endl;elsecout << "取值失败,您输入的位置" << l << "越界!!!" << endl << endl;//查找cout << "7.查找操作:";ch find;cout << "请输入您要查找的元素:  ";cin >> find;if (Locelem(L1, find) == 0)cout << "对不起,当前单链表中没有您查找的元素!!" ;elsecout << "查找成功,您所查找的元素" << find << "在当前单链表的第" << Locelem(L1, find) << "位" ;cout<<endl<<endl;cout << "8.插入操作:";int k;ch q;cout << "请您输入一个数字和一个字符,代表在第几位插入一个字符:";cin >> k;cin >> q;if (!insertlist(L1, k, q))cout << "Warning:输入序号越界,插入失败!!!" << endl;elsecout << "插入成功!!!" << endl << endl;cout << "9.当前单链表的元素有:";Displaylist(L1);cout << "10.删除操作:";int y;ch o;cout << "请您输入要删除的元素的序号:";cin >> y;if (!Delem(L1, y, o))cout << "对不起,您的输入的序号有误(越界),删除失败!" << endl << endl;elsecout << "删除成功!成功删除第" << y << "个元素" << o << endl << endl;cout << "11.当前单链表的元素有:";Displaylist(L1);//释放cout << "12.销毁单链表:";Destroylist(L1);cout << "销毁成功!!!";return 0;
}

 全部失败的样例:9,p,8p,7

全部成功的样例:4,c,2p,6

所以建议大家自己打吧,看完上面的写这个代码就很轻松 

感谢您今天的捧场,敬请期待下次演出。 See you next  illusion.

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

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

相关文章

Error Lens插件

最近在看视频学习的时候&#xff0c;发现了一个我认为很好用的插件。 就是Error Lens&#xff0c;这个插件它能够以高亮、内联显示代码中的错误、警告和其他诊断信息&#xff0c;让开发者无需查看控制台或问题面板&#xff0c;就能在编辑代码的过程中直观地看到并快速定位到代码…

Java-Java基础学习(4)-多线程(2)

3.7. Lambda表达式 为什么要使用lambda表达式 避免匿名内部类定义过多&#xff1b;可以让代码看起来更简洁&#xff1b;去掉一堆没有意义的代码&#xff0c;只留下核心逻辑 属于函数式编程的概念&#xff0c;格式 (params) -> expression [表达式](params) -> statement…

【MySQL】存储过程、存储函数、触发器

目录 存储过程介绍技术背景存储过程的作用与优势存储过程跟自定义函数很像。它们的区别是&#xff1a; 存储过程的缺点存储过程的特性基本存储过程使用1.创建语法语法说明&#xff1a;使用案例1.创建获取新闻类别数量的存储过程2.创建获取指定新闻类别ID下新闻数量的存储过程 2…

2022年第13届蓝桥杯Java省赛B组-星期计算

一、题目 星期计算 【问题描述】 已知今天是星期六&#xff0c;请问 天后是星期几&#xff1f;注意用数字 1 到 7 表示星期一到星期日。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#xff0c;在提交答案时只填写这个…

学习人工智能:Attention Is All You Need-1-介绍;Transformer模型架构;编码器,解码器

Transformer模型是目前最成功的chatGPT&#xff0c;Sora&#xff0c;文心一言&#xff0c;LLama&#xff0c;Grok的基础模型。 《Attention Is All You Need》是一篇由Google DeepMind团队在2017年发表的论文&#xff0c;该论文提出了一种新的神经网络模型&#xff0c;即Trans…

极兔速递邀您参观2024长三角快递物流供应链与技术装备展览会

2024长三角快递物流供应链与技术装备展览会&#xff08;杭州&#xff09; 2024年7月8-10日 | 杭州国际博览中心 参展企业介绍 J&T极兔速递是一家全球综合物流服务运营商&#xff0c;快递业务在全球规模最大及增长最快的东南亚和中国市场处于领先地位。公司创立于2015年&a…

部署静态网页②

前言&#xff1a; 前两天写了篇部署个人静态网页的文章&#xff1a;建立部署个人静态网站&#xff0c;有朋友指出了很多问题&#xff0c;然后这篇文章的目的主要是说一下ssl证书的申请&#xff0c;还有推荐介绍另一种部署的方式&#xff0c;还有解决在edge打开域名被警告的情况…

【绘•分享】翻翻书里寻智慧:小布去动物园

part 1 《小布去动物园》是英国著名童书作家罗德坎贝尔创作&#xff0c;收录于广受欢迎的“小布启蒙成长翻翻书”系列。这本书以幼儿为阅读对象&#xff0c;精心设计以促进孩子全面成长。它不仅是一本视觉欣赏的书&#xff0c;更是一本触摸感知书&#xff0c;带领孩子们探索…

实时移动物体检测项目实战代码

往期热门博客项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 正文开始&#xff01; 实时…

Linux: 线程安全

Linux 线程共享了进程的资源(地址空间, 页表等), 多个线程同时访问同一个资源就可能产生问题:数据竞争 临界资源: 多个线程共享的资源临界区: 访问临界资源的区域互斥: 任何时刻, 只有一个执行流能进入临界区同步: 以一定顺序访问临界资源原子性: 要么完成, 玩么未完成 锁 死…

什么快递可以寄摩托车?看你要啥样的了

一辆49cc的二冲程摩托车仅需561元。 购买125的组装车不会超过1元&#xff0c;购买250品牌发动机的组装车不会超过4000元。 购买一辆名牌摩托车大约需要4000到10000元。 花一万到两百万多就能买到一辆像样、动力强劲、能玩的炫酷摩托车。 哈哈&#xff0c;就看你想要什么了&…

20240309web前端_第二周作业_完成游戏导航栏

作业&#xff1a;游戏导航栏 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0…

杭州克鲁斯机器人控制信号线缆故障维修攻略,快来了解一下!

克鲁斯机器人作为工业自动化的重要组成部分&#xff0c;其稳定运行对于生产效率至关重要。克鲁斯机器人控制信号线缆作为机器人与外部控制设备之间的桥梁&#xff0c;承担着传输指令和反馈信号的重要任务。 一、克鲁斯机器人控制信号线缆故障识别与诊断 故障现象&#xff1a;当…

Godot 学习笔记(4):一切以场景为中心

文章目录 前言场景搭建新建子场景最简单的按钮事件 手动控制场景手动加载场景添加多个场景对象更快速的获取脚本对象 删除多个场景对象脚本命名的问题 总结 前言 Godot的场景是C#与Godot最后的中间连接。我们解决了场景的加载&#xff0c;我们基本可以保证C#和godot之间的彻底…

JVM的知识

什么是JVM 1.JVM&#xff1a; JVM其实就是运行在 操作系统之上的一个特殊的软件。 2.JVM的内部结构&#xff1a; &#xff08;1&#xff09;因为栈会将执行的程序弹出栈。 &#xff08;2&#xff09;垃圾99%的都是在堆和方法区中产生的。 类加载器&#xff1a;加载class文件。…

处理 input type=‘hidden‘ 的事件触发

前言 在公司的 MES 系统&#xff08;摩尔元数N2&#xff09;做二次开发页面。某个字段在表单模型中配置为 弹出窗口 后、页面的对应字段样式自动转为 <input type"hidden"> &#xff0c;从而导致不能使用常规的 blur 、keydown 事件触发关联操作。下面是解决思…

【力扣刷题日记】603.连续空余座位

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 603.连续空余座位 表&#xff1a;Cinema 列名类型seat_idintfreebool Seat_id 是该表的自动递增主键列。 在…

【RabbitMQ | 第一篇】消息队列基础知识

文章目录 1.消息队列基础知识1.1什么是消息队列&#xff1f;1.2消息队列有什么用&#xff1f;&#xff08;结合项目说&#xff09;1.2.1异步处理1.2.2削峰/限流1.2.3降低系统耦合性1.2.4实现分布式事务 1.3消息队列的缺点1.4JMS和AMQP1.4.1 JMS的两种消息模型&#xff08;1&…

高效备考2024年AMC10:吃透2000-2023年1250道真题(限时免费送)

我们今天继续来随机看5道AMC10真题&#xff0c;以及详细解析&#xff0c;这些题目来自1250道完整的官方历年AMC10真题库。通过系统研究和吃透AMC10的历年真题&#xff0c;参加AMC10的竞赛就能拿到好名次。即使不参加AMC10竞赛&#xff0c;掌握了这些知识和解题思路后初中和高中…

#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行

3 月 19 日&#xff0c;#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行。 现场&#xff0c;深圳市南山区人民政府副区长李志娜发布《2024 年南山区支持鸿蒙原生应用发展首批政策措施清单》&#xff0c;从加强鸿蒙原生应用供给能力、推动鸿蒙原生应用产业集聚、完善鸿蒙原生…