数据结构——考研笔记(三)线性表之单链表

文章目录

      • 2.3 单链表
        • 2.3.1 知识总览
        • 2.3.2 什么是单链表
        • 2.3.3 不带头结点的单链表
        • 2.3.4 带头结点的单链表
        • 2.3.5 不带头结点 VS 带头结点
        • 2.3.6 知识回顾与重要考点
        • 2.3.7 单链表的插入和删除
          • 2.3.7.1 按位序插入(带头结点)
          • 2.3.7.2 按位序插入(不带头结点)
          • 2.3.7.3 指定结点的后插操作
          • 2.3.7.4 指定结点的前插操作
          • 2.3.7.5 按位序删除(带头结点)
          • 2.3.7.6 知识回顾与重要考点
        • 2.3.8 单链表的查找
          • 2.3.8.1 按位查找
          • 2.3.8.2 按值查找
          • 2.3.8.3 知识回顾与重要考点
        • 2.3.9 单链表的建立
          • 2.3.9.1 尾插法
          • 2.3.9.2 头插法


2.3 单链表

2.3.1 知识总览

image-20240715163504480

2.3.2 什么是单链表

image-20240715163622432

  • 顺序表

    • 优点:可随机存取,存储密度高
    • 缺点:要求大片连续空间,改变容量不方便
  • 单链表

    • 优点:不要求大片连续空间,改变容量方便
    • 缺点:不可随机存取,要消耗一定空间存放指针
  • 用代码实现单链表

image-20240715164545122

typedef struct LNode{			//定义单链表结点类型ElemType data;		//每个节点存放一个数据元素struct LNode* next;  //指针指向下一个节点
}LNode,*LinkList;
2.3.3 不带头结点的单链表
#include <stdlib.h>typedef struct LNode {	//定义单链表结点类型int data;			//每个节点存放一个数据元素struct LNode* next; //指针指向下一个节点
}LNode,*LinkList;//初始化一个空的单链表
bool InitList(LinkList& L) {L = NULL;	//空表,暂时还没有任何结点return true;
}//判断单链表是否为空
bool Empty(LinkList L) {if (L == NULL)return true;elsereturn false;
}void test() {LinkList L;	//声明一个指向单链表的指针//初始化一个空表InitList(L);//……后续代码……
}
2.3.4 带头结点的单链表

image-20240715171402035

#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;L->next = NULL;			//头结点之后暂时还没有节点return true;
}//判断单链表是否为空
bool Empty(LinkList L) {if (L->next == NULL)return true;elsereturn false;
}void test() {LinkList L;	//声明一个指向单链表的指针//初始化一个空表InitList(L);//……后续代码……
}
2.3.5 不带头结点 VS 带头结点

image-20240715171704621

  • 不带头结点:写代码更麻烦对第一个数据结点和后续数据结点的处理需要用不同的代码逻辑对空表和非空表的处理需要用到不同的代码逻辑
  • 带头结点:写代码更方便。
2.3.6 知识回顾与重要考点

image-20240715171817961

2.3.7 单链表的插入和删除

image-20240715172017835

2.3.7.1 按位序插入(带头结点)
  • ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。

image-20240715172337653

  • 代码展示

image-20240715174709999

#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;L->next = NULL;			//头结点之后暂时还没有节点return true;
}//判断单链表是否为空
bool Empty(LinkList L) {if (L == NULL)return true;elsereturn false;
}//在第i个位置插入元素e(带头结点)
bool ListInsert(LinkList& L, int i, int e) {if (i < 1)return false;LNode* p;	//指针p指向当前扫描到的结点int j = 0;	//当前p指向的是第几个结点p = L;		//L指向头结点,头结点是第0个结点(不存数据)while (p != NULL && j < i - 1) {	//循环找到第i-1个结点p = p->next;j++;}if (p == NULL)	//i值不合法return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;	//将结点s连到p之后return true;	//插入成功
}void main() {LinkList L;	//声明一个指向单链表的指针//初始化一个空表InitList(L);//……后续代码……
}
2.3.7.2 按位序插入(不带头结点)

image-20240715175632081

  • 代码展示
#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;L->next = NULL;			//头结点之后暂时还没有节点return true;
}//判断单链表是否为空
bool Empty(LinkList L) {if (L == NULL)return true;elsereturn false;
}//在第i个位置插入元素e(带头结点)
bool ListInsert(LinkList& L, int i, int e) {if (i < 1)return false;if (i = 1) {	//插入第1个结点的操作与其它结点的操作不同LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = L;L = s;		//头指针指向新节点return true;}LNode* p;	//指针p指向当前扫描到的结点int j = 1;	//当前p指向的是第几个结点p = L;		//L指向头结点,头结点是第0个结点(不存数据)while (p != NULL && j < i - 1) {	//循环找到第i-1个结点p = p->next;j++;}if (p == NULL)	//i值不合法return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;	//将结点s连到p之后return true;	//插入成功
}void main() {LinkList L;	//声明一个指向单链表的指针//初始化一个空表InitList(L);//……后续代码……
}
2.3.7.3 指定结点的后插操作

image-20240715180832621

//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode* p, int e) {if (p == NULL)return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (s == NULL)	//内存分配失败return false;s->data = e;	//用结点s保存数据元素es->next = p->next;p->next = s;	//将结点s连到p之后return true;
}
2.3.7.4 指定结点的前插操作

image-20240715181828300

  • 代码展示
//前插操作:在p结点之前插入元素e
bool InsertPriorNode(LNode* p, int e) {if (p == NULL)		//内存分配失败return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->next = p->next;p->next = s;		//新结点s连到p之后s->data = p->data;	//将p中元素复制到s中p->data = e;		//p中元素覆盖为ereturn true;
}
2.3.7.5 按位序删除(带头结点)
  • ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

image-20240715183805791

  • 代码展示
//删除表中第i个元素
bool ListDelete(LinkList& L, int i, int& e) {if (i < 1)return false;LNode* p;		//指针p指向当前扫描到的结点int j = 0;		//当前p指向的是第几个结点p = L;			//L指向头结点,头结点是第0个结点(不存数据)while (p != NULL && j < i - 1) {	//循环找到第i-1个结点p = p->next;j++;}if (p == NULL)	//i值不合法return false;if (p->next == NULL)	//第i-1个结点之后无其他结点return false;LNode* q = p->next;		//令q指向被删除结点e = q->data;			//用e返回元素的值p->next = q->next;		//将*q结点从链中“断开”free(q);				//释放结点的存储空间return true;			//删除成功
}
2.3.7.6 知识回顾与重要考点

image-20240715190156270

2.3.8 单链表的查找

image-20240715190606364

  • GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。
  • LocalteElem(L,e):按值查找。在表L中查找具有给定关键字值的元素。
2.3.8.1 按位查找
  • 代码展示
//按位查找,返回第i个元素(带头结点)
LNode* GetElem(LinkList L, int i) {if (i < 0)return false;LNode* p;		//指针p指向当前扫描到的结点int j = 0;		//当前p指向的是第几个结点p = L;			//L指向头节点,头结点是第0个结点(不存数据)while (p != NULL && j < i) {	//循环找到第i个结点p = p->next;j++;}return p;
}
2.3.8.2 按值查找
  • 代码展示
//按值查找,找到数据域==e的结点
LNode* LocateElem(LinkList L, int e) {LNode* p = L->next;//从第1个结点开始查找数据域为e的结点while (p != NULL && p->data != e)p = p->next;return p;	//找到后返回该结点指针,否则返回NULL
}
2.3.8.3 知识回顾与重要考点

image-20240715192241414

2.3.9 单链表的建立

image-20240715192343150

如果给你很多个数据元素(ElemType),要把它们存到一个单链表里边,怎么办呢?

step1:初始化一个单链表

step2:每次取一个数据元素,插入到表尾/表头

2.3.9.1 尾插法
  • 代码展示
//尾插法
LinkList List_TailInsert(LinkList& L) {	//正向建立单链表int x;								L = (LinkList)malloc(sizeof(LNode));//建立头结点LNode* s, * r = L;					//r为表尾指针scanf("%d", &x);					//输入结点的值while (x != 9999) {					//输入9999表示结束s = (LNode*)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;							//r指向新的表尾结点scanf("%d", &x);}r->next = NULL;						//尾结点指针置空return L;
}
2.3.9.2 头插法
  • 代码展示
//头插法
LinkList List_HeadInsert(LinkList& L) {LNode* s;int x;L = (LNode*)malloc(sizeof(LNode));	//建立头结点L->next = NULL;						//初始化空链表scanf_s("%d", &x);					//输入结点的值while (x != 9999) {					//输入9999表示结束s = (LNode*)malloc(sizeof(LNode));//创建新结点s->data = x;s->next = L->next;L->next = s;					//将新结点插入表中,L为头指针scanf_s("%d", &x);}return L;
}

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

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

相关文章

spring事务 @Transactional

文章目录 1. 简介1.1 什么是事务1.2 什么是Spring事务管理1.3 Transactional注解的作用 2. Transactional注解的使用2.1 如何在Spring中使用Transactional2.2 Transactional的属性配置 3. Transactional的工作原理3.1 Spring如何管理事务3.2 Transactional的底层实现 4. Transa…

数学建模·灰色关联度

灰色关联分析 基本原理 灰色关联分析可以确定一个系统中哪些因素是主要因素&#xff0c;哪些是次要因素&#xff1b; 灰色关联分析也可以用于综合评价&#xff0c;但是由于数据预处理的方式不同&#xff0c;导致结果 有较大出入 &#xff0c;故一般不采用 具体步骤 数据预处理…

wps批量删除空白单元格

目录 原始数据1.按ctrlg键2.选择“空值”&#xff0c;点击“定位”3. 右击&#xff0c;删除单元格修改后的数据 原始数据 1.按ctrlg键 2.选择“空值”&#xff0c;点击“定位” 如图所示&#xff0c;空值已被选中 3. 右击&#xff0c;删除单元格 修改后的数据

微软Office PLUS办公插件下载安装指南

微软OfficePLUS插件下载安装指南 简介&#xff1a; OfficePLUS微软官方出品的Office插件 &#xff0c;OfficePLUS拥有30万高质量模板素材&#xff0c;能帮助Word、Excel、Powerpoint、PDF等多种办公软件提升效率&#xff0c;具有智能化、模板质量高、运行快、稳定性强等优点。…

抽象工厂模式与工厂方法(简单工厂)的区别

在软件开发中&#xff0c;简单工厂模式和工厂方法模式是两种常用的创建型设计模式。尽管它们都用于创建对象&#xff0c;但它们的实现方式和应用场景有所不同。本文将详细探讨这两种模式的区别&#xff0c;帮助你更好地理解和应用它们。 简单工厂模式 简单工厂模式&#xff0…

昇思25天学习打卡营第11天|RNN实现情感分类

概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This film is great 正确标…

Mongodb复合索引

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第90篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

【计算机毕业设计】002基于weixin小程序家庭记账本

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【实战:python-Django发送邮件-短信-钉钉通知】

一 Python发送邮件 1.1 使用SMTP模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Headermsg_from 306334678qq.com # 发送方邮箱 passwd luzdikipwhjjbibf # 填入发送方邮箱的授权码(填入自己的授权码&#xff0c;相当于邮箱…

鸿蒙语言基础类库:【@ohos.uitest (UiTest)】 测试

UiTest UiTest提供模拟UI操作的能力&#xff0c;供开发者在测试场景使用&#xff0c;主要支持如点击、双击、长按、滑动等UI操作能力。 该模块提供以下功能&#xff1a; [By]&#xff1a;提供控件特征描述能力&#xff0c;用于控件筛选匹配查找。[UiComponent]&#xff1a;代…

实验四:图像的锐化处理

目录 一、实验目的 二、实验原理 1. 拉普拉斯算子 2. Sobel算子 3. 模板大小对滤波的影响 三、实验内容 四、源程序和结果 (1) 主程序(matlab) (2) 函数GrayscaleFilter (3) 函数MatrixAbs 五、结果分析 1. 拉普拉斯滤波 2. Sobel滤波 3. 不同大小模板的滤波…

单点登陆思路及流程

单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种流行的身份验证和授权机制&#xff0c;允许用户通过一次登录获得对多个应用程序或系统的访问权限。实现单点登录可以提高用户体验、简化用户管理和减少密码重复输入等问题。下面是一种常见的单点登录实…

昇思25天学习打卡营第7天 | 基于MindSpore的GPT2文本摘要

本次打卡基于gpt2的文本摘要 数据加载及预处理 from mindnlp.utils import http_get# download dataset url https://download.mindspore.cn/toolkits/mindnlp/dataset/text_generation/nlpcc2017/train_with_summ.txt path http_get(url, ./)from mindspore.dataset impor…

以太坊(以太坊solidity合约)

以太坊&#xff08;以太坊solidity合约&#xff09; 1&#xff0c;以太坊2&#xff0c;开发名词解释&#xff08;1&#xff09;钱包&#xff08;2&#xff09;Solidity&#xff08;3&#xff09;Ether&#xff08;以太币&#xff09;&#xff08;4&#xff09;Truffle&#xff…

Redis 7.x 系列【23】哨兵模式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 工作原理2.1 监控2.2 标记下线2.3 哨兵领袖2.4 新的主节点2.5 通知更新 3. …

请求响应(后端必备)

一、请求 1.简单参数 原始方式&#xff1a; 在原始的web程序中&#xff0c;获取请求参数&#xff0c;需要通过HttpServletRequest对象手动获取 RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){String name request.getP…

什么叫价内期权?直接带你了解期权价内期权怎么使用?!

今天带你了解什么叫价内期权&#xff1f;直接带你了解期权价内期权怎么使用&#xff1f;&#xff01;价内期权是具有内在价值的期权。期权持有人行权时&#xff0c;对看涨期权而言&#xff0c;行权价格低于标的证券结算价格&#xff1b;对看跌期权而言&#xff0c;标的证券结算…

js 请求blob:https:// 图片

方式1 def get_file_content_chrome(driver, uri):result driver.execute_async_script("""var uri arguments[0];var callback arguments[1];var toBase64 function(buffer){for(var r,nnew Uint8Array(buffer),tn.length,anew Uint8Array(4*Math.ceil(t/…

前端Vue组件化实践:自定义加载组件的探索与应用

在前端开发领域&#xff0c;随着业务逻辑复杂度的提升和系统规模的不断扩大&#xff0c;传统的开发方式逐渐暴露出效率低下、维护困难等问题。为了解决这些挑战&#xff0c;组件化开发作为一种高效、灵活的开发模式&#xff0c;受到了越来越多开发者的青睐。本文将结合实践&…

Java基础及进阶

JAVA特性 基础语法 一、Java程序的命令行工具 二、final、finally、finalize 三、继承 class 父类 { //代码 }class 子类 extends 父类 { //代码 }四、Vector、ArrayList、LinkedList 五、原始数据类型和包装类 六、接口和抽象类 JAVA进阶 Java引用队列 Object counter ne…