数据结构之单链表——考研笔记

文章目录

  • 一.单链表定义
    • 1.什么是单链表
    • 2.代码实现
    • 3.不带头结点的单链表
    • 4.带头结点的单链表
  • 二.单链表插入删除
    • 1.按位序插入(带头结点)
    • 2.插入时不带头节点
    • 3.指定节点的后插操作
    • 4.指定节点的前插操作
    • 5.按位序删除(带头结点)
    • 6.删除指定节点p
  • 三.单链表查找
    • 1.按位查找
    • 2.按值查找
    • 3.求表长
  • 四.单链表建立
    • 1.尾插法建立单链表
    • 2.头插法建立单链表

在这里插入图片描述

一.单链表定义

1.什么是单链表

在这里插入图片描述
单链表一个节点需要存放数据元素和指向下一个节点的指针,由于每个节点只包含一个指针,所以叫单链表。
单链表:改变容量方便,但不可随机存取

2.代码实现

struct LNode//LNode:结点
{
	ElemType data;//数据域,每个节点存放一个数据元素
	struct LNode *next;//指针域,指针指向下一个节点
};
//用malloc函数增加新的节点
struct LNode *p=(struct LNode*)malloc(sizeof(struct LNode));

书写麻烦,因此可以用typedef 给关键字重命名

typedef <数据类型> <别名>
typedef int zhengshu;
zhengshu x=1;
typedef int *zhengshuzhizhen;
zhengshuzhizhen p;
tyepedef struct LNode LNode;
LNode *p=(LNode*)malloc(sizeof(LNode));

//综上:

typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;
//struct LNode重命名为LNode,linklist:指向struct LNode的指针

表示一个单链表时,只需声明一个头指针L,指向单链表的第一个节点
在这里插入图片描述

  • LNode* L:强调返回的是一个节点
    等价于
  • LinkList L:强调是一个单链表
    都是声明一个指向单链表节点的指针

3.不带头结点的单链表

//初始化一个空的单链表
bool InitList(LinkList &L)
{
	L=NULL;//空表,暂时没有任何节点
	return true;
}
bool Empty(LinkList L)
{
	return(L==NULL);
}
void test()
{



	LinkList L;//声明一个指向单链表的指针
	InitList(L);
}

4.带头结点的单链表

bool InitList(LinkList &L)
{
	L=(LNode*)malloc(sizeof(LNode));//分配一个头节点
	if(L==NULL)//内存不足分配失败
	{	
		return false;
	}
	L->next=NULL;//头节点之后暂时还没有节点
	return true;
}

在这里插入图片描述
头节点不存放数据,只有这个头结点之后的下一个数据才存放数据
在这里插入图片描述

二.单链表插入删除

单链表的插入删除只需要移动指针

在这里插入图片描述
在这里插入图片描述

上一个节点的指针域存放着下一个节点的地址,现在s节点要插进来,所以应该把b所在节点的地址放在s节点的指针域里,而b所在节点的地址在哪呢?在没插前b所在节点的地址在p节点的指针域里,所以咱把s-next=p-next(把p节点的指针域赋值给s节点的指针域),这样s节点的指针域就有b所在节点的地址了。然后咱再让p-next=s(把s节点的地址信息赋值给p节点的指针域),这样一个单链表插入节点的操作就完成了
在这里插入图片描述

1.按位序插入(带头结点)

InsertList(&L,i,e);
//找到第i-1个节点,将新节点插入其后
i=2
在这里插入图片描述
头节点可以看成第0个节点,所以当i=1时也适用
分析:

  1. i=1时(插在表头)
  2. 插在表中
  3. 插在表尾
  4. i>length
//在第i个位置插入元素e
ListInsert(LinkList &L,int i,int e)
{
	if(i<1)
		return false;
	LNode *p;//p指向当前扫到的节点
	int j=0;//当前p指向的是第几个节点,头节点是第0个节点
	p=L;//L指向头节点,头节点是第0个节点(不存数据)
	if(p!=NULL && j<i-1)//循环找到第i-1个节点
	{
		p=p->next;
		j++;
	}
	if(p==NULL)//p值不合法
		return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;//s节点连在p后
	return true;
}		
	//else
	//	e.next=L.i;
	//	L.i-1->next=L.e;
	

2.插入时不带头节点

在这里插入图片描述

bool InsertList(LinkList &L,int i,int e)
{
	if(i<1)
		return false;
	if(i==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://p指向第1个节点(不是头节点)
	while(p!=NULL&&p<i-1)	
	{
		p=p->next;
		j++;
	}
	if(p==NULL)
		return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}

在这里插入图片描述

3.指定节点的后插操作

在这里插入图片描述

//在p指针后插入元素e
bool InsertList(LNode *p,ElemType e)
{
	if(p==NULL)
		return false;//**注意p为空的情况
	LNode *s=(LNode*)malloc(sizeof(LNode));
	if(s==NULL)
		return false;//**生成内存空间失败
	//p后节点已知
	s->data=e;//**用节点s保存数据e
	s->next=p->next;
	p->next=s;//将s结点连在p后
	return true;
	
}	

4.指定节点的前插操作

在这里插入图片描述
在这里插入图片描述

//在结点p之前插入e
bool InsertPriorList(LinkList L,LNode *p,ElemType e)//**传入一个头指针
{
	if(p==NULL)
		return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	if(s==NULL)//空间满了
		return false;
	s->data=e;
	int j=0;
	j=L;
	L.i=p;
	while(j<i-1)
	{
		j=L->next;
		j++;
		
	}
	
	s->next=p;
	j->next=s;
	return true;
		

另一种实现方式
在这里插入图片描述

//用新节点覆盖旧结点,再将旧节点放入新结点中
bool InsertPriorList(LNode *p,ElemType e)
{
	if(p==NULL)
		return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	if(s==NULL)
		return false;
	s->next=p->next;
	p->next=s;//新节点连在p后
	s->data=p->data;//p中元素复制到s中
	p->data=e;//p中元素覆盖到e
	return true;

时间复杂度O(1)

5.按位序删除(带头结点)

ListDelete(&i,i,&e):删除表L中第i个位置的元素,并用e返回删除元素的值
找到第i-1个节点并指向i+1节点最后将第i个位置的节点释放掉

bool ListDelete(LinkList &L,int i,ElemType &e)
{
	if(i<1)//**节点从1开始
		return false;
	LNode *p;//**声明指针p扫到当前指向的节点
	int j=0;//p扫到的是第几个结点
	p=L;//p指向L头节点,头节点是第0个结点
	 
	while(p!=NULL&&j<i-1)//**指针p不能为空
	{
		p=p->next;//**p一个个向后扫
		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;
}

最坏时间复杂度:O(n)

6.删除指定节点p

bool DeleteList(LNode *p)
在这里插入图片描述

bool DeleList(LNode *p)
{
	if(p==NULL)
		return false;
	LNode*q=p->next;
	p->data=p->next->data;//**和后继节点数据域交换data
	p->next=q->next;
	free(q);//释放后继结点的存储空间
	return true;
}

在这里插入图片描述
如果p指向最后一个节点,则上述结点有BUG
在这里插入图片描述
单链表局限性:只能单向检索,不能逆向检索
在这里插入图片描述

!](https://i-blog.csdnimg.cn/direct/4f4772a7ec84437e850b2775299340dd.png)

三.单链表查找

基于带头结点的单链表

  1. 按位查找
  2. 按值查找

1.按位查找

GetElem(L,i):获取表中第i个位置元素的值
LocateElem(L,e):按值查找
//按位查找,找到单链表中第i个位置的结点
LNode *GetElem(LinkList L,int i)
{
	if(i<0)
		 return NULL;
	LNode *p;//指针p指向当前扫描到的节点
	p=L;//p指向头节点
	int j=0;
	while(p!=NULL&&j<i)
	{
		p=p->next;
		j++;
	}
	return p;
}

2.按值查找

//按值查找
LNode *LocateElem(LinkList L,ElemType e)
{
	LNode *p;
	p=L->next;//从第1个节点开始查找数据域为e的节点
	while(p!=NULL && p->data!=e)
		p=p->next;
	return p;//找到后返回该节点的指针,否则返回NULL
}

在这里插入图片描述

3.求表长

int length(LinkList L)
{
	int i=0;
	LNode *p=L->next;
	while(p!=NULL)
	{
		p=p->next;
		i++;
	}
	return i;
}

四.单链表建立

  1. 尾插法
  2. 头插法
  • Step1.初始化一个单链表
  • Step2.每次去一个数据元素,插到表尾/头
typedef struct
{
	ElemType 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;
}
void test()
{
	LinkList L;
	InitList(L);
}

1.尾插法建立单链表

void TailList(LinkList &L)
{
	L=(LNode*)malloc(sizeof(LNode));//建立头节点
	int x;//把ElemType设为整型
	int *s,*r=L;//r为表尾指针
	scanf(%d",&x);
	while(e!=99999)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;//在r后插入元素x
		r=s;//r指向新的表尾结点
		scanf("%d",&x);
	}
	r->next=NULL;//尾结点指针置空
	return L;
}
		

在这里插入图片描述

在这里插入图片描述

2.头插法建立单链表

bool NextNode(LNode *p,ElemType e)
{
	if(p==NULL)
		return false;
	LNode *s =(LNode*) malloc(sizeof(LNode));
	if(s==NULL)//内存分配失败
		return false;
	s->data=e;//用节点s保存数据元素e
	s->next=p->next;
	p->next=s;//将结点s连在p之后
	return true;
}

在这里插入图片描述

核心:初始化操作和指定节点的后插操作
尾插法需要设置一个指向表尾节点的指针
头插法可以用于链表逆置
给你一个单链表L,如何实现逆置?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年【北京市安全员-A证】找解析及北京市安全员-A证考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-A证找解析考前必练&#xff01;安全生产模拟考试一点通每个月更新北京市安全员-A证考试试卷题目及答案&#xff01;多做几遍&#xff0c;其实通过北京市安全员-A证证考试很简单。 1、【多选题】《中华人…

保姆级教程 | 全流程免费:合并多份长宽不同的PDF成相同大小并进行瘦身

背景 由于老板需要&#xff0c;完成不同PDF文件&#xff08;a&#xff0c;b&#xff0c;c....&#xff09;合并&#xff0c;同时要求主文件&#xff08;A&#xff09;小于6M。合并过程中发现各个PDF大小&#xff08;长宽&#xff09;并不相同&#xff0c;造成合并后效果不好也…

网站安全问题都有哪些,分别详细说明

网站安全问题涉及多个方面&#xff0c;以下是一些常见的网站安全问题及其详细说明&#xff1a; 数据泄露 问题描述&#xff1a;数据泄露是指网站存储的用户敏感信息&#xff08;如用户名、密码、信用卡信息等&#xff09;被非法获取。黑客可能通过SQL注入、XSS攻击等手段窃取这…

Unity编辑器界面及其基础功能介绍

文章目录 Unity编辑器界面编辑器默认界面布局打开和关闭编辑界面自定义界面布局Unity资源商店Unity Assets Store什么是资源商店&#xff1f;资源商店中包含哪些东西&#xff1f;如何进行素材导入&#xff1f;Unity官网购买素材或插件导入方法非官网素材导入非官网插件导入 Sce…

【WRF数据准备】基于GEE下载静态地理数据-叶面积指数LAI及绿色植被率Fpar

【WRF数据准备】基于GEE下载静态地理数据 准备:WRF所需静态地理数据(Static geographical data)数据范围说明基于GEE下载叶面积指数及绿色植被率GEE数据集介绍数据下载:LAI(叶面积指数)和Fpar(绿色植被率)数据处理:基于Python处理为单波段LAI数据参考GEE的介绍可参见另…

基于Django+python的酒店客房入侵检测系统设计与实现

项目运行 需要先安装Python的相关依赖&#xff1a;pymysql&#xff0c;Django3.2.8&#xff0c;pillow 使用pip install 安装 第一步&#xff1a;创建数据库 第二步&#xff1a;执行SQL语句&#xff0c;.sql文件&#xff0c;运行该文件中的SQL语句 第三步&#xff1a;修改源…

Spring beanFactoryPostProcessor

项目结构和代码 Component public class CustomerBeanFactoryPostProcessor implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {System.out.printl…

基于Spring Boot的宿舍管理系统设计与实现(源码+定制+开发)宿舍信息管理平台、智能宿舍系统开发、学生宿舍管理平台设计、宿舍入住与信息管理

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

华为:高级ACL 特定ip访问特定ip命令

网络拓扑图&#xff1a; 网络环境&#xff1a; 全网互通即可 1.创建一个名为test的高级ACL acl name test advance 2.添加规则 ##拒绝所有ip访问 rule 10 deny ip source any destination 192.168.1.10 0.0.0.0 只允许特定ip访问特定ip rule 5 permit ip source 192.168.2.10…

C++与现代开发实践第三节:多线程与并发编程

第四章&#xff1a;C与现代开发实践 第三节&#xff1a;多线程与并发编程 在这一课中&#xff0c;我们将详细探讨多线程与并发编程的各个方面&#xff0c;特别是从线程的创建、管理到高级的优化技术&#xff0c;并且通过复杂的实战案例来展示如何应对并发问题。最后&#xff…

并联 高电压、高电流 放大器实现 2 倍输出电流模块±2A

1.1 并联输出电路设计注意事项 直接对两个功率运算放大器的输出进行硬接线并不是一种好的电气做法。如果两个运算放大器的输出直接连接在一起&#xff0c;则可能会导致不均匀的电流共享。这是因为其中的每个运算放大器都尝试强制施加略微不同的 Vout 电压&#xff0c;该电压取决…

【HarmonyOS NEXT】使用 Navigation 对折叠屏设备页面进行分栏展示,优化 UI 交互

关键词&#xff1a;折叠屏、navigation、router、路由、分栏、UI 随着科技的发展&#xff0c;手机设备形态也由一面屏向多面屏进行发展&#xff0c;那么软件的UI适配也面临着问题&#xff0c;本篇文章主要解决大屏设备的页面 UI 适配问题&#xff0c;如折叠屏&#xff0c;平板&…

Spring Boot 3项目创建与示例(Web+JPA)

以下是一个Spring Boot 3.3.4整合JPA的示例,它展示了如何在Spring Boot应用程序中使用JPA进行数据持久化。 版本与环境 Spring Boot 3.3.4数据库: MySQL 8.0.40, MySQL的安装使用可以参考: MySQL 8 下载与安装攻略JDK 17Maven 3.6项目创建 可以使用Spring Initializr 初始…

一家生物技术企业终止,科创属性可能不足,报告期内专利数猛增

轩凯生物九成以上营业收入来源于植物营养领域&#xff0c;收入来源结构单一&#xff0c;产品下游应用领域较为集中。报告期内公司应收账款账面价值逐年上升&#xff0c;回款比例显著低于前两年&#xff0c;遭交易所问询是否存在较大的坏账风险。 轩凯生物核心技术是否成熟以及是…

ssm智慧社区电子商务系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…

Java面向对象编程进阶(四)

Java面向对象编程进阶&#xff08;四&#xff09; 一、equals()方法的使用二、toString()方法的使用三、复习 一、equals()方法的使用 适用性&#xff1a;任何引用数据都可以使用。 自定义的类在没有重写Object中equals()方法的情况下&#xff0c;调用的就是Object类中声明的…

C++初阶教程——C++入门

一、本章主要内容 C在C的基础之上&#xff0c;加入了面向对象编程的思想&#xff0c;并增加了许多有用的库以及编程范式。可以说&#xff0c;C是C的子集。在这章的内容中&#xff0c;笔者将会为诸位读者讲C如何补充C语言的一些不足。比如&#xff1a;作用域、IO、函数、指针等。…

Swift Macro 在业务开发中的探索与实践

简介 Swift Macro 在 Swift 5.9 版本中正式引入&#xff0c;且需配合 Xcode 15 使用。Swift Macro 作为一种新的设计方法&#xff0c;致力于帮开发者降低编写重复代码的繁琐&#xff0c;以更为简洁优雅的方式去实现。 在 OC 中&#xff0c;有大家熟知的宏 #define&#xff0c;…

Pseudo Multi-Camera Editing 数据集:通过常规视频生成的伪标记多摄像机推荐数据集,显著提升模型在未知领域的准确性。

2024-10-19&#xff0c;由伊利诺伊大学厄巴纳-香槟分校和香港城市大学的研究团队提出了一种创新方法&#xff0c;通过将常规视频转换成伪标记的多摄像机视角推荐数据集&#xff0c;有效解决了在未知领域中模型泛化能力差的问题。数据集的创建&#xff0c;为电影、电视和其他媒体…

练习LabVIEW第二十三题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第二十三题&#xff1a; 建立一个枚举控件&#xff0c;其内容为张三、李四、王五共三位先生&#xff0c;要求当枚举控件显…