23..【摆脱list链表的束缚、让你爱上链表】

发布于:2023-01-15 ⋅ 阅读:(154) ⋅ 点赞:(0)

(一)、定义及其初始化

在这里插入图片描述

1.list 和vector的区别

链表相比于vector,优点在于方便插入和删除,缺点是随机访问比较慢。

2.【list链表初始化】

list<数据类型> 函数名;

3.【设定空间初始化】

list<数据类型> 函数名(a,b); 设定a个空间,元素为b.

4.动态链表赋值动态链表】

list<数据类型>函数名1(函数名2); 把动态链表2复制给动态链表1

5.【利用迭代器复制动态链表】

list<数据类型>函数名1(函数名2.begin(),函数名2.end()); 动态链表二复制给动态链表1

6.【普通数组复制给链表】

list<数据类型>函数名1(函数名2,sizeof(函数名2)/sizeof(int));

6.1代码展示:

#include <list>
using namespace std;
int main()
{
    list<int> list_a;       //初始化为0
    list<int> list_b(4,88);      //开辟四个空间,且每个元素都为88;
    list<int> list_c(list_b);     // 动态链表复制给动态链表
    list<int> list_d(list_b.begin(), list_b.end());       //利用迭代器的方法
    int s[] = { 2,5,8 };
    list<int> list_e(s, s + sizeof(s)/sizeof(int));       //普通数组复制给链表
}

6.2效果展示:

在这里插入图片描述
在这里插入图片描述

(二)、list的基本属性

在这里插入图片描述

1.【链表的长度】

函数名.size()

2.【链表的清空操作】

函数名.clear()

3.【判断链表是否为空】

函数名.empty()

4.【获取链表第一个元素】

函数名.front()

5.【获取链表最后一个元素】

函数名.back()

6.【链表与链表的交换】

函数名.swap()

7.【链表的排序】

函数名.sort() 默认升序

8.实战项目

在这里插入图片描述

8.1代码展示:

#include <list>

using namespace std;

int main()

{
 list<int> list_a; //初始化为0

 int s[4] = { 2,5,8 };

 list<int> list_b(s, s + sizeof(s)/sizeof(int)); //普通数组复制给链表

 int size;

 size = list_a.size(); //链表长度

 bool is_list = list_a.empty(); //链表是否为i空

 list_b.push_front(1); //在头部插入

 list_b.push_back(2); //在尾部插入

 int a=list_b.front(); //获取第一个

 int b=list_b.back(); //获取最后一个

 // list_b.clear();

 list_a.swap(list_b);

 list_a.sort(); // 对链表进行排序,默认升序

 return 0;

}

8.2效果展示:

在这里插入图片描述

(三)、list链表的应用

在这里插入图片描述

1.【头部插入一个数据】

函数名.push_front()

2.【尾部插入一个数据】

函数名.push_back()

3.【多元插入数据】

函数名.insert(函数名.begin(),n) 从哪开始 插入谁

4.【多元插入数据2】

函数名.insert(函数名.begin(),n,m) 从哪开始 插入几个 插入谁

5.【利用迭代器插入】

iist〈函数类型〉 ::iterator 对象名;

对象名=函数名.begin();

函数名.insert(对象名,个数,元素)

6.【删除头一个元素】

函数名.pop_front()

7.【删除最后一个元素】

函数名.pop_back()

8.【多元删除数据】

函数名1.erase(函数名1.begin(),函数名1.end()

9.【链表遍历只能是迭代器遍历】

iist〈函数类型〉 ::iterator  对象名;

for(对象名=函数名.begin();对象名!=end();对象名++)

{
  cout<<*对象名;

}

10.实战项目

在这里插入图片描述

代码展示:

#include <list>

#include <iostream>

using namespace std;

int main()

{
 list<int> list_a; //初始化为0

 int s[4] = { 2,5,8 };

 list<int> list_b(s, s + sizeof(s)/sizeof(int)); //普通数组复制给链表

 list_b.push_front(1); //在头部插入

 list_b.push_back(2); //在尾部插入

 list_b.insert(list_b.begin(), 66); // 从哪插入, 插入什么

 list_b.insert(list_b.end(), 88);           

 list_b.insert(list_b.end(),3, 100); // 从哪插入, 插入几个,插入谁

 

 list<int>::iterator it; //利用迭代器锦新插入

 it = list_b.begin();

 it++;

 list_b.insert(it, 5, 111);

 

 list_b.insert(list_b.begin(), s, s + sizeof(s) / sizeof(int)); //插入普通数组

 

 list_b.pop_front(); //删除头部一个

 list_b.pop_back(); //删除尾部一个

 

 //list_b.erase(list_b.begin(), list_b.end()); // 从头到位删除

 

 list<int>::iterator itor;

 for (itor = list_b.begin(); itor!= list_b.end(); itor++)

 {
  cout << *itor << " ";

 }

 return 0;

}

效果展示:

在这里插入图片描述
在这里插入图片描述

(四)、实战操作:

在这里插入图片描述

在这里插入图片描述

1.代码展示:

【切记呀,在list链表中只能用迭代器进行操作,而且也不能在删除的过程中使用+的符号】

#include <iostream>
#include <list>
using namespace std;
int main()
{
    int i = 0;
    list<int> list_a(13);
    list<int>::iterator it;
    for (it=list_a.begin();it!=list_a.end();it++)
    {
        i++;
        cout << "请输入第"<< i<< "个数据" << endl;
        cin >> *it;
    }
    for (it = list_a.begin(); it != list_a.end(); it++)
    {
        int j = 0;
        if (*it == 3)
        {
            list_a.erase(it, it);
        }
        else
        {
            cout << *it << " ";
        }
    }
    return 0;

}

2.项目效果

在这里插入图片描述
在这里插入图片描述
制作不易,还请多多指教…

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到