一、STL中的 list 是双向链表,但不是循环链表,通过指针访问结点数据,它的内存空间可以是不连续的,使用它能高效地进行各种操作。
二、代码
#include <bits/stdc++.h>
using namespace std;
// 打印链表元素的函数
void printList(list<int>& myList)
{
for(int value : myList)
{
cout << value << " ";
}
cout << endl;
}
// 修改链表中指定元素的值
void modifyElement(list<int>& myList, int oldValue, int newValue)
{
for(auto& value : myList)
{
if(value == oldValue)
{
value = newValue;
}
}
}
// 查找链表中是否存在指定元素
bool findElement(list<int>& myList, int target)
{
for(int value : myList)
{
if(value == target)
{
return true;
}
}
return false;
}
int main()
{
// 初始化一个链表
list<int> myList = {1, 2, 3, 4, 5};
cout << "初始链表: ";
printList(myList);
// 删除元素 3
auto it = find(myList.begin(), myList.end(), 3);
if(it != myList.end())
{
myList.erase(it);
cout << "删除元素 3 后的链表: ";
printList(myList);
}
// 在元素 4 之前插入元素 6
it = find(myList.begin(), myList.end(), 4);
if (it != myList.end())
{
myList.insert(it, 6);
cout << "在元素 4 之前插入元素 6 后的链表: ";
printList(myList);
}
// 在链表末尾插入元素 7
myList.push_back(7);
cout << "在链表末尾插入元素 7 后的链表: ";
printList(myList);
// 在链表头部插入元素 0
it = myList.begin();
myList.insert(it,0);
cout << "在链表头部插入元素 0 后的链表: ";
printList(myList);
// 修改元素 4 为 8
modifyElement(myList, 4, 8);
cout << "将元素 4 修改为 8 后的链表: ";
printList(myList);
// 查找元素 6
if(findElement(myList, 6))
{
cout << "链表中存在元素 6。" << endl;
}
else
{
cout << "链表中不存在元素 6。" << endl;
}
return 0;
}
三、程序分析
1、下面这个是链表的初始化。当然也可以通过 for 循环和 push_back 来进行初始化。
list<int> myList = {1, 2, 3, 4, 5};
2、下面这个是 printList()函数里面的 for 循环,它是C++11标准引入的,比传统的 for 循环更加的简洁。在 myList 这个链表范围内从第一个元素开始,只将结点的数据域的值赋给定义好的 value ,然后执行 cout 操作,再自动到下一个结点,并将其数据域的值赋给 value ,这样依次类推。
for(int value : myList)
{
cout << value << " ";
}
3、下面这个指将 it 指向的那个结点给删除掉,但是删除之后不影响整个链表的完整性,函数内部会自动补全。
myList.erase(it);
4、下面这个指将 it 指向的那个结点插入数据域为 6 的新结点,至于 it 指向的那个结点会整体后移。这个操作函数内部会自动实现。
myList.insert(it, 6);
5、下面这个指将数据域为 7 的新结点插入到链表的尾部,注意 push_back()函数只能够在尾部进行插入。
myList.push_back(7);
6、下面这个 it1 指向的是链表的第一个结点,但是 it2 不是指向链表的最后一个结点,而是指向链表最后一个结点再下一个特殊位置,就像假如 it 指向最后一个结点的话,那么 it++ == it2。在 STL 的 list 中,it++ 指 it 指向下一个结点,这是 list 已经定义好的。
it1 = myList.begin();
it2 = myList.end();
7、下面这个里面的 auto& value 是指定义了一个引用类型的变量 value ,相当于起了一个别名,这样更加方便。
for(auto& value : myList)
{
if(value == oldValue)
{
value = newValue;
}
}
8、如果 it 指向链表 list 的其中一个结点,那么在执行下面这个语句后,it 就指向了该结点的下一个结点。这个是 list 中定义好的。
it++;
四、输出结果
