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

C++中如何使用STL中的list定义一个双向链表,并且实现增、删、改、查操作

 一、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++;

 四、输出结果

相关文章:

  • #SVA语法滴水穿石# (012)关于 first_match、throughout、within 的用法
  • 华为交换机配置指南:基础到高级命令详解
  • 51单片机使用定时器实现LCD1602的时间显示(STC89C52RC)
  • 迭代器运算详解(四十二)
  • OSI模型中协议数据单元(PDU)
  • 21 天 Python 计划:MySQL库相关操作
  • 深信服护网蓝初面试题
  • TYUTJava阶段测试
  • Spring 概念
  • 初探:简道云系统架构及原理
  • 定时器的实现方案:红黑树、最小堆与时间轮
  • 【蓝桥杯速成】日期问题(填空题) + 真题讲解 python
  • POSIX线程库
  • 程序化广告行业(65/89):AdX/SSP系统深度剖析与实战要点
  • 《操作系统真象还原》第五章(3)——载入内核
  • JAVA学习-练习试用Java实现“实现一个Hadoop MapReduce任务,对大数据集中的数值进行排序和筛选”
  • 23种设计模式-行为型模式-中介者
  • 可以使用费曼学习法阅读重要的书籍
  • 【学Rust写CAD】34 精确 Alpha 混合函数(argb.rs补充方法)
  • 路由器的 WAN(广域网)口 和 LAN(局域网)口
  • 南充市建设厅官方网站/搜索seo优化托管
  • 做网站需要学php吗/网站seo
  • 如何看网站空间问题/seo站内优化培训
  • 如何自己做网站挣钱/社群推广平台
  • 做视频解析网站/游戏推广员是违法的吗
  • 有专业做网站/郑州网络推广公司排名