第一百零六天学习记录:数据结构与算法基础:单链表(王卓教学视频)

news2024/9/23 21:28:50

线性表的链式表示和实现

结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻
线性表的链式表示又称为非顺序映像或链式映像。
用一组物理位置任意的存储单元来存放线性表的数据元素。
这组存储单元既可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。
链表中元素的逻辑次序和物理次序不一定相同。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单链表、双链表、循环链表

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

链表(链式存储结构)的特点

1、结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。
2、访问时只能通过头指针进入链表,并通过每个结点的指针域依次向后顺序扫描其余结点(顺序存取法),所以寻找第一个结点和最后一个结点所花费的时间不等。
在这里插入图片描述
在这里插入图片描述

单链表的定义和表示

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

单链表的基本操作的实现☆☆☆☆

在这里插入图片描述
用C++实现:

My_List* initList()
{
	My_List* temp = new My_List;
	temp->pnext = NULL;
	return temp;
}

在这里插入图片描述

bool ListEmpty(My_List* temp)
{
	if (temp->pnext == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

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

void My_DeleteAll(My_List* temp)
{
	My_List* p;
	while (temp)
	{
		p = temp;
		temp = temp->pnext;
		delete p;
	}
}

在这里插入图片描述

void My_ClearAll(My_List* temp)
{
	My_List* p;
	My_List* q;
	p = temp->pnext;
	while (p)
	{
		q = p->pnext;
		delete p;
		p = q;
	}
	temp->pnext = NULL;
}

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

int ListLength(My_List* temp)
{
	My_List* p;
	p = temp->pnext;
	int num = 0;
	while (p)
	{
		++num;
		p = p->pnext;
	}
	return num;
}

老师建议:基础且极其重要,必须熟练掌握。
在这里插入图片描述
在这里插入图片描述
较复杂函数的实现:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

bool GetRnum(My_List* temp, int i, My_List* &mycache)
{
	My_List* p;
	p = temp->pnext;
	int j = 1;
	while (p&&j<i)
	{
		p = p->pnext;
		++j;
	}
	if (!p || j>i)
	{
		return false;
	}
	mycache = p;
	return true;
}

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

int LocateR(My_List* temp, int change)
{
	int j = 1;
	My_List* p = temp->pnext;
	while (p&&p->pdata.My_num!=change)
	{
		p = p->pnext;
		++j;
	}
	if (p!=NULL)
	{
		return j;
	}
	else
	{
		return 0;
	}
}

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

bool ListInsertfromI(My_List* temp, int i, My_List* mycache)
{
	int j = 0;
	My_List* p = temp;
	while (p&&j<i-1)
	{
		p = p->pnext;
		++j;
	}
	if (!p || j>i - 1)
	{
		return false;
	}
	mycache->pnext = p->pnext;
	p->pnext = mycache;
	return true;
}

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

bool ListDelete(My_List* temp, int i)
{
	My_List* p = temp;
	int j = 0;
	while (p->pnext&&j<i-1)
	{
		p = p->pnext;
		++j;
	}
	if (!(p->pnext) || j>i - 1)
	{
		return false;
	}
	My_List* q = p->pnext;
	p->pnext = q->pnext;
	delete q;
	return true;
}

时间复杂度分析

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

bool FrontInsert(My_List* temp)
{
	My_List* insertcache = new My_List;
	while (true)
	{
		cout << "请输入您所要添加资源的编号>=" << endl;
		cin >> insertcache->pdata.My_num;
		if (cin.fail()) {
			cout << "您输入的不是一个整数,请重新输入:" << endl;
			cin.clear();
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
			continue;
		}
		cout << "请输入您所要添加资源的名字>=" << endl;
		cin >> insertcache->pdata.My_name;
		if (cin.fail()) {
			cout << "您输入的不是一个正确的名字,请重新输入:" << endl;
			cin.clear();
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
			continue;
		}
		cout << "请输入您所要添加资源的剩余量>=" << endl;
		cin >> insertcache->pdata.My_Resources;
		if (cin.fail()) {
			cout << "您输入的不是一个整数,请重新输入:" << endl;
			cin.clear();
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
			continue;
		}
		break;
	}
	insertcache->pnext = temp->pnext;
	temp->pnext = insertcache;
	cout << "需要继续添加吗?1、需要;其他、不需要" << endl;
	int tempnum;
	cin >> tempnum;
	if (cin.fail()) {
		tempnum = 0;
		cin.clear();
		cin.ignore(numeric_limits<streamsize>::max(), '\n');
	}
	if (tempnum == 1)
	{
		return true;
	}
	else
	{
		return false;
	}
}

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

bool AfterInsert(My_List* temp)
{
	My_List* insertcache = new My_List;
	while (temp->pnext)
	{
		temp = temp->pnext;
	}
	while (true)
	{
		cout << "请输入您所要添加资源的编号>=" << endl;
		cin >> insertcache->pdata.My_num;
		if (cin.fail()) {
			cout << "您输入的不是一个整数,请重新输入:" << endl;
			cin.clear();
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
			continue;
		}
		cout << "请输入您所要添加资源的名字>=" << endl;
		cin >> insertcache->pdata.My_name;
		if (cin.fail()) {
			cout << "您输入的不是一个正确的名字,请重新输入:" << endl;
			cin.clear();
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
			continue;
		}
		cout << "请输入您所要添加资源的剩余量>=" << endl;
		cin >> insertcache->pdata.My_Resources;
		if (cin.fail()) {
			cout << "您输入的不是一个整数,请重新输入:" << endl;
			cin.clear();
			cin.ignore(numeric_limits<streamsize>::max(), '\n');
			continue;
		}
		break;
	}
	insertcache->pnext = NULL;
	temp->pnext = insertcache;
	cout << "需要继续添加吗?1、需要;其他、不需要" << endl;
	int tempnum;
	cin >> tempnum;
	if (cin.fail()) {
		tempnum = 0;
		cin.clear();
		cin.ignore(numeric_limits<streamsize>::max(), '\n');
	}
	if (tempnum == 1)
	{
		return true;
	}
	else
	{
		return false;
	}
}

最后代码运行如下:

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

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

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

相关文章

Thymeleaf th名称空间-表达式语法-访问域对象-获取请求参数-内置对象

基本语法&#xff1a;th名称空间 基本语法&#xff1a;表达式语法 修改标签文本值 代码示例&#xff1a; <p th:text"标签体新值">标签体原始值</p>th:text作用 不经过服务器解析&#xff0c;直接用浏览器打开HTML文件&#xff0c;看到的是『标签体原…

使用C语言连接MySQL

目录 一、引入库 1.1 下载库文件 1.2 在项目中引入库 二、使用库 2.1 连接数据库 2.2 SQL请求 2.3 获取查询结果 2.4 使用案例 一、引入库 1.1 下载库文件 要使用C语言连接MySQL&#xff0c;需使用MySQL官网提供的库 MySQL :: Download Connector/Chttps://dev.mysq…

家政服务小程序开发预约功能

家政服务的需求也越来越大&#xff0c;为了更加方便用户预约服务&#xff0c;很多家政服务平台开始开发微信小程序&#xff0c;为用户提供在线预约服务。那么&#xff0c;如何开发家政服务小程序的预约功能呢&#xff1f;下面我们将结合一些参考信息&#xff0c;为大家详细介绍…

vue-element-admin || 后台管理三级/多级菜单设置

如图&#xff0c;基于vue-element-admin前端框架实现三级菜单&#xff0c;其中页面只对应三级菜单&#xff0c;无二级菜单的页面。 文件组织&#xff0c;在views文件夹下如下组织文件结构&#xff0c;其中第三级的菜单就是具体的.vue文件 在一级菜单hxb_sys下&#xff0c;要…

PROFIBUS-DP主站转ETHERCAT网关连接canopen协议报文解析实例

大家好&#xff0c;今天要给大家介绍一款远创智控的神秘产品&#xff0c;它的名字叫YC-DPM-ECT&#xff0c;是一款兼具PROFIBUS-DP主站功能的通讯网关。想象一下&#xff0c;它既能和PROFIBUS总线打交道&#xff0c;又能与ETHERCAT网络愉快地交流&#xff0c;是不是感觉很神奇&…

【Arduino小车实践】PID应用之四驱小车

一、 PID公式 二、 PID应用的必要性 1. 四驱小车运动 左边两个驱动轮和右边两个驱动轮的速度相同直线右边轮子的速度大于左边轮子的速度左偏右边轮子的速度小于左边轮子的速度 右偏 2. 产生多种运动的原因 小车的4个电机&#xff0c;减速箱以及车轮在物理层面上存在误差&am…

Spark(21):SparkStreaming之DStream入门

目录 0. 相关文章链接 1. WordCount 案例实操 1.1. 需求 1.2. 添加依赖 1.3. 编写代码 1.4. 启动程序并通过netcat发送数据 2. WordCount 解析 0. 相关文章链接 Spark文章汇总 1. WordCount 案例实操 1.1. 需求 使用 netcat 工具向 9999 端口不断的发送数据&#xf…

Flutter系列文章-Flutter环境搭建和Dart基础

Flutter是Google推出的一个开源的、高性能的移动应用开发框架&#xff0c;可以用一套代码库开发Android和iOS应用。Dart则是Flutter所使用的编程语言。让我们来看看如何搭建Flutter开发环境&#xff0c;并了解Dart语言的基础知识。 一、Flutter环境搭建 1. 安装Flutter SDK …

Blender 3.6 LTS更新的5个新功能,一定要试试

Blender基金会已正式发布Blender 3.6 LTS&#xff08;长期支持&#xff09;。它是备受期待的该公司开源 3D 软件的长期支持版本&#xff0c;也是 Blender 3.x 系列的最终 LTS 版本。Blender 3.6有一个用于设置基于粒子的模拟的模拟节点和一个升级的 UV 封装系统&#xff0c;其中…

IDEA自动添加注释作者版本时间等信息

File | Settings | Editor | Live Templates 点击加号&#xff0c;选择第二项 设置一个名称 再次点击加号&#xff0c;选择第一项 填写名称&#xff08;设置完成后再代码中输入该名称即可插入该注释内容&#xff09;&#xff0c;描述&#xff0c;及内容 /*** author 名字…

深度图像Range Image

从点云创建深度图并显示 函数原型 RangeImage::createFromPointCloud (const PointCloudType& point_cloud, float angular_resolution, float max_angle_width, float max_angle_height, …

Leaflet Ant Path(水系流动效果)

一、源代码&#xff1a; 用leaflet库中的Leaflet.AntPath插件 将通量动画&#xff08;如蚂蚁行走&#xff09;放入折线中 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><…

【UE】运行游戏时就获取鼠标控制

问题描述 我们经常在点击运行游戏后运行再在视口界面点击一下才能让游戏获取鼠标控制。其实只需做一个设置就可以在游戏运行后自动获取鼠标控制。 解决步骤 点击编辑器偏好设置 如下图&#xff0c;点击“播放”&#xff0c;再勾选“游戏获取鼠标控制” 这样当你运行游戏后直…

12、k8s Namespaces 资源隔离

Kubernetes Namespaces _ Kubernetes(K8S)中文文档_Kubernetes中文社区 Kubernetes Namespaces 实现资源隔离和配额的隔离,比如下面的信息: 所有对象都在Namespace中? 大多数Kubernetes资源(例如pod、services、replication controllers或其他)都在某些Namespace中,…

【LeetCode热题100】打卡第36天:多数元素打家劫舍

文章目录 【LeetCode热题100】打卡第36天&#xff1a;多数元素&打家劫舍⛅前言 多数元素&#x1f512;题目&#x1f511;题解 打家劫舍&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第36天&#xff1a;多数元素&打家劫舍 ⛅前言 大家好&#xff0c;我是…

pytorch安装问题【超级简单版】

pytorch安装问题 当前遇到的问题&#xff1a; python3.9无法安装读取coco数据集的 pycocotools-windows,那么需要切换版本到3.6/7/8&#xff0c;但是切换到python 3.6之后&#xff0c;无法安装torchvision和pytorch【在python就叫torch】&#xff0c;显示没有这个版本 pip i…

MS1205N激光测距用高精度时间测量(TDC)电路

MS1205N 是一款高精度时间测量 (TDC) 电路&#xff0c;具有四通 道、多脉冲的采样能力、高速 SPI 通讯、多种测量模式&#xff0c;适合 于激光雷达和激光测距。 主要特点  单精度模式 60ps  双精度模式 30ps  非校准测量范围 3.5ns(0ns) 至 25μs  单…

案例分析:成功的APP开发背后的故事

如今&#xff0c;我们生活在一个信息化时代&#xff0c;在这个信息时代&#xff0c;不管是工作还是生活都离不开手机 APP。因为有了手机 APP&#xff0c;我们的生活变得更加便捷、智能。但随着移动 APP开发的火热&#xff0c;很多企业都想要制作一个自己的 APP。然而在众多的 A…

822. 走方格

链接&#xff1a; 链接 题目&#xff1a; 给定一个 nmnm 的方格阵&#xff0c;沿着方格的边线走&#xff0c;从左上角 (0,0)(0,0) 开始&#xff0c;每次只能往右或者往下走一个单位距离&#xff0c;问走到右下角 (n,m)(n,m) 一共有多少种不同的走法。 输入格式 共一行&#xff…

【Docker】简单的Linux安装Redis

目录 Docker 安装 Redis拉取镜像安装容器修改配置文件容器随docker启动自动运行redis客户端 史上最详细Docker安装Redis &#xff08;含每一步的图解&#xff09;实战 Docker 安装 Redis 拉取镜像 docker pull redis安装容器 创建redis配置文件目录&#xff1a;如果内部没有相…