C++---链表

2023-09-18 20:39:36

1、链表

1.1、链表的结构

image-20230918180750132

  • 每个链表开头都有一个头指针Head
  • 尾节点的指针域为NULL,用于判断此列表是否结束
    • 如果一个链表开始就为NULL,那么该链表为空链表
  • 链表中的先后不代表在真实内存中的位置,只是单纯的逻辑上关系

1.2、创建链表

  1. 我们首先利用结构体创建一个Student的结构体
//利用链表创建3个学生的信息,学生信息包括姓名和年龄
struct Student
{
	char name[20];
	int age;
	//这里存放的下个节点的地址
	Student *next;
};
  1. 接着我们给我们的节点赋值,跟着上面的图,我们知道需要一个头节点(无数据,只存地址),一个尾节点(有数据,地址为NULL)
	Student c = { "t3",21, nullptr};//尾节点,指针域为nullptr
	Student b = { "t2",27,&c };
	Student a = { "t1",22,&b };
	Student* head = &a; //头指针,指向a,无值

1.3、链表数据的遍历

创建完链表后,我们来输出一下内容,那么我们就需要链表a的地址,然后输出完当前内容后,将指针指向下一个地址

	//定义一个指针来指向head
	Student *pointer = head;
	//循环到尾节点(nullptr)时结束
	while (pointer)
	{
		cout << pointer->name << " " << pointer->age << endl;
		//输出完后指向下一个
		pointer = pointer->next;
	}

image-20230918184725137

1.4、链表的查找

  1. 我们查找一下t2这个人,并返回他的年龄
	while (pointer)
	{
		if (pointer->name=="t2")
		{
			cout << pointer->age << endl;
			break;
		}
		pointer = pointer->next;
	}
	if (pointer==nullptr)
	{
		cout << "没有找到此人" << endl;
	}

1.5、链表的插入

我们首先手动新加一条数据

Student d = { "t4",21,nullptr };

​ 区别与数组,我们不需要移动任何数据,只需要将要插入的地方的前一项地址指向插入的数据,插入的数据再指向后一条数据即可(PS:灵魂画手,不要介意)

image-20230918195201994

​ 这里需要注意一点,先指向C,不然早断开C会找不到C的地址,也就是E的指针域要先指向C的地址,防止丢失。

​ 那么我们就在t2的后面插入一条数据

	//before指向前一条数据
	//pointer指向后一条数据
	Student* before = head;
	Student *pointer = before->next;

	while (before)
	{
		if (before->name=="t2")
		{
			d.next = pointer; //赋值&c的地址
			before->next = &d; //t2断开c的地址,链接d的地址
			break;
		}
		//如果不匹配,就让俩个指针往后走
		before = pointer;
		pointer = before->next;
	}

image-20230918202035976

1.6、链表的删除

那么删除就只需要将要被删除的节点指向的地址,给到前一个节点。

image-20230918202535567

那我们就删除上面新加的t4

	before = head;
	pointer = before->next;
	//这里需要注意是因为要删除后一个,所以pointer作为循环条件
	while (pointer)
	{
		if (pointer->name == "t4")
		{
			before->next = pointer->next;
			break;
		}
		before = pointer;
		pointer = pointer->next;
	}

image-20230918203247697

2、链表和数组的区别

数组链表
内存占用连续内存灵活,无限制
元素类型相同类型可以相同,可以不同
组织形式在内存中连续排序各节点在内存中彼此分散,靠指针联系
插入删除元素需要遍历只修改某个或几个节点的指针

更多推荐

AIGC(生成式AI)试用 6 -- 从简单到复杂

从简单到复杂,这样的一个用例该如何设计?之前浅尝试用,每次尝试也都是由浅至深、由简单到复杂。一点点的“喂”给生成式AI主题,以测试和验证生成式AI的反馈。AIGC(生成式AI)试用1--基本文本_Rolei_zl的博客-CSDN博客AIGC(生成式AI)试用2--胡言乱语_Rolei_zl的博客-CSDN博客AIGC(

测试域: 流量回放-工具篇jvm-sandbox,jvm-sandbox-repeater,gs-rest-service

JVM-SandboxJvm-Sandbox-Repeater架构_小小平不平凡的博客-CSDN博客https://www.cnblogs.com/hong-fithing/p/16222644.html流量回放框架jvm-sandbox-repeater的实践_做人,最重要的就是开心嘛的博客-CSDN博客[jvm-s

HTTP代理反爬虫技术详解

HTTP代理是一种网络技术,它可以将客户端的请求转发到目标服务器,并将服务器的响应返回给客户端。在网络安全领域中,HTTP代理经常被用来反爬虫,以保护网站的正常运营。HTTP代理反爬虫的原理是通过限制访问者的IP地址、访问频率、User-Agent和验证码验证等方式,来限制恶意爬虫的访问。下面我们来具体分析一下这几种方

拓世AIGC | 大语言模型螺旋上升式进化,人文、技术与未来

本月初,上海世博园举办外滩大会见解论坛中,众多学者和企业家共同探讨了大语言模型时代的人机关系、硅基生命和碳基生命未来之争等议题。面对全新的局面,论坛释放出积极信号和值得持续关注的论点。从黄浦江的波涛翻涌,我们捕捉到了人工智能未来科技的波澜壮阔。(汇集近20位两院院士、诺贝尔奖和图灵奖得主,超500位科技企业家和专家学者

Websocket集群解决方案以及实战(附图文源码)

最近在项目中在做一个消息推送的功能,比如客户下单之后通知给给对应的客户发送系统通知,这种消息推送需要使用到全双工的websocket推送消息。所谓的全双工表示客户端和服务端都能向对方发送消息。不使用同样是全双工的http是因为http只能由客户端主动发起请求,服务接收后返回消息。websocket建立起连接之后,客户端

WebMvcConfigurerAdapter、WebMvcConfigurer、WebMvcConfigurationSupport

WebMvcConfigurerAdapter、WebMvcConfigurer、WebMvcConfigurationSupport的关系?WebMvcConfigurerAdapter、WebMvcConfigurer和WebMvcConfigurationSupport是SpringMVC框架中用于配置Web应用

android系统目录结构

文章目录android系统目录结构问答偏好设置保存在哪里在应用设置中点击清除数据,清除的是什么在应用设置中点击清除缓存,清除的是什么参考android系统目录结构/-system(一般只有root权限才能访问)-data-app(存放应用程序的APK文件)-data(内部存储)-<安装的应用包名>-app_textur

lock和synchronized的区别

lock和synchronized都是在多线程环境下用于保护共享资源的机制,但它们有一些重要的区别:实现方式:synchronized是Java语言内置的关键字,可以用于方法或代码块级别的同步。Lock是一个接口,位于java.util.concurrent.locks包下,提供了更灵活的锁定机制。灵活性:Lock提供

SQL-4大板块(存储过程、函数、视图、触发器)

一、存储过程(做复杂运算)1.做复杂运算,是对变量做运算;2.可以对多个表进行update、insert、delete、select、query;3.可以在最终结果返回多个表,但是对对接环境有苛刻要求,比如:VB不支持接收返回多个表4.当一个查询语句无法实现,或者语句查询速度很慢时,想提高效率就会用到存储过程。先把需要

MongoDB——将时间戳转换为日期

在MongoDB中将时间戳转换为日期从timestamp转换为日期取决于我们保存时间戳的类型。它是对象、数字还是字符串类型?我们可以在mongoshell上使用以下命令检查字段的类型。在本教程中,我们将学习如何将时间戳转换为数字、字符串或对象类型的日期。检查字段类型://MongoDB5.0.8>typeofdb.co

滑动时间窗口的思想和实现,环形数组,golang

固定时间窗口在开发限流组件的时候,我们需要统计一个时间区间内的请求数,比如以分钟为单位。所谓固定时间窗口,就是根据时间函数得到当前请求落在哪个分钟之内,我们在统计的时候只关注当前分钟之内的数量,即[0s,60s],因为流量并不是均匀的,所以就会出现,在两个分钟之间超过阈值,1分50秒时来了150个请求,在2分10秒时来

热文推荐