链表list

2023-11-02 09:23:58 浏览数 (1)

链表我们在C 语言数据结构中已经有笔记说明了,list和vector的区别其实就相对于数组和链表的区别

vector是内存连续的结构,list是内存不连续的结构 二者的对比我之前已经在笔记中专门有一篇说这个的 传送门https://cloud.tencent.com/developer/article/2338529

总之,根据他们特性的差异可以格局自己的具体场合来选择合适STL模型 以提高程序的性能为主

list的头文件和命名空间

#include<list>

using namespace std;在std标准命名空间中

List的定义

list是动态链表 跟vector一样 他也能够应对各种类型,它是一个类模板 例如

list<int> list_int;//定义了一个内部元素是int的链表

list<char> list_int;//定义了一个内部元素是char的链表

list<Books> list_int;//定义了一个内部元素是Books的链表

list<char*> list_int;//定义了一个内部元素是char*的链表

而且容量大小没有限制

list的初始化

初始化的方法也是有多种,

代码语言:javascript复制
#include <list>
int main (int argc, char* argv[])
{
  std::list<int> one;                                //定义一个空的、元素类型是 int 的 list 链表
  std::list<int> two(4,100);               //定义一个包含4个元素,每个元素的值都是100的 list 链表
  std::list<int> three(two.begin(),two.end());  //使用 two 这个对象的迭代器,从开始到结束的所有元素来初始化当前对象
  std::list<int> four(three);                       // 使用 three 这个对象来初始化当前对象
  
  int myints[] = {16,2,77,29};
  std::list<int> five (myints, myints   sizeof(myints) / sizeof(int) ); //使用一个普通的 int 数组来初始化当前对象

  return 0;
}

同时我们也可以通过

代码语言:javascript复制
#include<list>
#include<vector>
using namespace std;

int main()
{
 vector<int>arr_int(20,2);
 list<int>arr_list(arr_int.begin(),arr_int.end());
}

将vector对象的数据初始化为list的数据

list的常用基本操作

list<int> list_int;

① list_int.size();        //返回 list_int 链表元素的总个数

② list_int.front();        //返回 list_int 链表的第一个元素的值

③ list_int.back();        //返回 list_int 链表的最后一个元素的值

④ list_int.clear();        //清空 list_int 链表,即把里面的所有元素都删除

⑤ list_int.begin();        //返回 list_int 链表第一个数的迭代器

⑥ list_int.end();        //返回 list_int 链表最后一个数的迭代器

⑦ list_int.empty();        //判断 list_int 链表是否为空,如果为空则返回true,非空(有元素)则返回false

⑧ list_int.swap(v1);    //v1是另一个动态链表,将 list_int 和 v1 两个链表的元素互换

⑨ list_int.reverse();     //把 list 中的元素顺序倒转

⑩ list_int.sort();                    // 给list排序

a list_int.splice(list_int.begin(), list_2); //将两个list合并

list的动态插入

list 支持的动态插入也有多种方式:

①、调用 push_back 在尾部插入一个元素,只能是一个一个插入:list_int.push_back(3);

②、调用 push_front 在头部插入一个元素,只能是一个一个插入:list_int.push_front(2);

③、调用 insert 在第一个元素的前面插入一个元素,list_int.insert(list_int.begin(), 888);

④、调用 insert 在第一个元素的前面插入3个888元素,list_int.insert(list_int.begin(), 3, 888);

list 的动态删除

①、list_int.pop_back();    //删除 list_int动态链表的最后一个元素

②、list_int.erase(list_int.begin()); //删除第一个元素

③、list_int.erase(itor, list_int.end()); //删除中间的元素

list 的遍历

因为是 list 不是数组,所以不能用下标来遍历,只能用迭代器来遍历,如下:

for (list<int>::iterator itor =list_int.begin(); itor !=list_int.end(); itor)

{

    int value = *itor;

    cout << "value = " << value << endl;

}

homework

定义一个 int 类型的 list 动态链表,将以下元素:1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 插入到动态链表中。之后,使用 for 循环删除动态链表中的值为 3 的元素,并将结果输出出来!

代码语言:javascript复制
#include<list>
#include<vector>
#include<iostream>
using namespace std;

int main()
{
 int arr_list[] = { 1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 };
 list<int> list_(arr_list, arr_list   sizeof(arr_list) / sizeof(int));
 for (list<int>::iterator pr = list_.begin(); pr!= list_.end(); pr  )
 {
     if (*pr == 3)
     {
         pr = list_.erase(pr);
     }
     cout << " list_ = :" << *pr;
 }
}

0 人点赞