链表
参考资料
C++链表及其创建
小灰的算法之旅(是一个纸质书)
基础概念
定义:
链表是由一系列节点组成的,每一个节点都是一个数据结构
结构
链表是由一个个节点组成的,那么什么是节点,节点是由什么组成的呢?
链表是由要保存的数据成员和一个指针组成的:
- 链表中的每一个节点都包含一个或多个保存数据的成员
- 链表还包含一个后继指针指向链表中的下一个节点
如图这是链表的结构:
链表的开始和结束
开始
非空链表的第一个结点称为链表的头,要访问链表中的结点,需要有一个指向链表头的指针。从链表头开始,可以按照存储在每一个节点中的后继指针访问链表中的其余结点。
结束
最后一个结点中的后继指针被设置为nullptr以表示链表的结束
图片展示
注意,图 2 中绘制的链表结点彼此非常接近,排列整齐。实际上,链表结点可能散布在内存的各个部分。
链表的C++表示
为了在C++中表示链表,需要有一个表示链表中单个结点的数据类型。需要有一个指向另一个相同类型结点的指针。
//链表的创建
struct ListNode
{
double value;//用于储存信息
ListNode *next;//指向下一个指针,具有和自己相同的类型
}
ListNode结构有一个有趣的属性,它包含一个指向相同类型数据结构的指针,因此可以说是一个包含对自身引用的类型。像这样的类型称为自引用数据类型或自引用数据结构
//构造函数
ListNode(string str1, ListNode* next1 = nullptr) {
str = str1;
next = next1;
}
浅浅的分析一下,在创建一个链表的节点时,此时他的值等于传来的参数,他的后指针指向第二个形参
我将写一段代码实现链表的创建输入和链表的输出
int main() {
ListNode* list = nullptr;
int n = 0;
while (n < 3)
{
string str;
cin >> str;
list = new ListNode(str, list);
n++;
}
ListNode* pre = list;
while (pre != nullptr) {
//用while来输入,判断的依据是指针结束的标志 nullptr
cout << pre->str << " ";
//后指针指向的自身类型
pre = pre->next;
}
}
小结:如果把数组看做正规军那么链表就是地下党,对于链表的话可以储存问置是随机的,使用见缝插针的方式,随机的分布在不同的位置上,通过后指针联系在一起