当前位置: 首页 > news >正文

C++---链表

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};//尾节点,指针域为nullptrStudent b = { "t2",27,&c };Student a = { "t1",22,&b };Student* head = &a; //头指针,指向a,无值

1.3、链表数据的遍历

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

	//定义一个指针来指向headStudent *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、链表和数组的区别

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

http://www.lryc.cn/news/172518.html

相关文章:

  • Unity使用Mirror制作局域网的同步
  • 算法 N皇后问题-(递归回溯)
  • 个人博客搭建记录
  • 下载vscode 更新
  • std::async简单使用
  • 【编程实践】在VS studio中配置Eigen库
  • SQLite 3.43 发布,性能大提升!
  • 数据中心液冷服务器详情说明
  • Openresty(二十二)ngx.balance和balance_by_lua终结篇
  • Docker注入环境变量且设置多个环境变量
  • 代码随想录二刷Day 15
  • Node.js环境安装与服务设置,结合内网穿透随时随地公网访问!
  • 八、数据类型转换
  • 2023数学建模研赛华为杯E题思路-出血性脑卒中临床智能诊疗建模
  • Windows Server 2012 R2系统远程桌面的数字证书算法SHA1升级到SHA256
  • windows进程管理相关命令
  • Flutter快速入门学习(一)
  • 网站排名下降的原因和解决方法(SEO优化失误可能导致网站排名下降)
  • 爱看小说手机网源码全站带数据带自动采集程序/ThinkPHP内核小说网站源码+书库数据库带自动采集
  • 《Java8实战》
  • 【初阶数据结构】——堆排序和TopK问题
  • LLM - 大模型速递 InternLM-20B 快速入门
  • 探索AIGC人工智能(Midjourney篇)(四)
  • uni-app:跨页面传递数组
  • element 表格拖拽保存插件
  • 通过内网穿透,在Windows 10系统下搭建个人《我的世界》服务器公网联机
  • C++11异步任务轮子实现(header-only)
  • 2023华为杯研究生数学建模竞赛选题建议+初步分析
  • 多线程并发或线程安全问题如何解决
  • 深度学习——线性神经网络一