平台:Visual Studio 2022
编程工具:C++
目录:
1、链表的结构体实现
2、链表的声明、开辟空间
3、链表的初始化
4、链表的连接
5、链表输出
6、完整代码实例
1、链表的结构体实现
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:
- 一个是存储数据元素的数据域(上图中黄色区域)
- 另一个是存储下一个结点地址的指针域。 (上图中蓝色区域)
struct ListNode {
int val;
ListNode* next;
};
上面就是链表的结构体定义,可以看出结构体内有两个成员变量,val 是链表的数据部分,*next 是一个指针,代表链表指向下一个节点的引导部分。
2、链表的声明、开辟空间
链表的声明本质上其实是对结构体进行声明,比较特殊的一点是数据空间不能开辟到栈区内,只能开辟到堆区(也就是 new 一个)
(这里具体原理我也不知道为什么,我查的说是在栈区开辟空间以后地址不会更新,如果有大神知道为什么可以在评论区指教一下,谢谢)
//第一种声明方式
ListNode* head01;
head01 = new ListNode;
//第二种声明方式
ListNode* head2 = new ListNode;
有两种方式,第一种方式是先声明一个结构体指针对象,再开辟空间;第二种方式是在声明对象的同时就开辟空间了,(这里一定要用 new,把数据安排到堆区)
3、链表的初始化
head01->val = 10;
head01->next = nullptr;
head02->val = 20;
head02->next = nullptr;
//注意:
// 链表不赋初值的时候也会随机给分配一个值
// 判断的时候不能用 if(head->val == NULL),用 if(head == nullptr)
ListNode* head = new ListNode; //只声明分配地址空间,并没有初始化
cout << head->val << endl; //这里输出一个随机值(有值)
由上一节可知,head01 是一个指针的数据类型,所以它可以指向两个结构体的成员变量。
首先我们使用 head01->val 初始化当前节点的数据内容;然后我们使用 head01->next 指向下一个节点,由于目前没有连接下一个节点,所以我们指向空(在 C++ 中使用 nullptr 代表空指针,NULL 代表空值)
注意:如果只声明且分配空间以后,没有初始化,val里面也是会有一个随机值的
4、链表的连接
head01->next = head02;
一行代码,把 head02 赋值给 head01 指向下一个的指针 next 。
5、链表输出
cout << head01->val << endl;
cout << head01->next->val << endl; //重点
在链表中,val 的部分通常是我们需要的值,所以我们可以通过 head01->val 查看当前节点的值,也可以通过 head01->next->val 查看下一个连接节点的值
6、完整代码示例
#include <iostream>
using namespace std;
//定义链表结构体
struct ListNode {
int val;
ListNode* next;
};
void test01() {
ListNode* head01;
head01 = new ListNode;
head01->val = 10;
head01->next = nullptr; //指针型,必须是nullptr
ListNode* head02;
head02 = new ListNode;
head02->val = 20;
head02->next = nullptr;
head01->next = head02; //把两个表链接起来
//输出
cout << head01->val << endl;
cout << head01->next->val << endl; //重点
}
void test02() {
ListNode* head = new ListNode;
cout << head->val << endl;
// 链表不赋初值也会随机分配一个值,
// 判断的时候不能用if(head->val == NULL),用if(head == nullptr)
}
int main() {
test01();
test02();
system("pause");
return 0;
}