list链表的使用

本文深入探讨了STL中链表容器的内部实现原理,详细介绍了链表的基本使用方法,包括构造、初始化、插入、删除、访问、查找等操作,并提供了实例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

STL中封装了链表的容器list,内部实现是一个双向链表

不同于vector,list中每个元素在内存中的地址是不连续且没有规律的,所以用list进行插入和删除时间复杂度比vector低很多,

例如在vector插入一个元素之后,这个元素后面的地址全部会改变,而list不会,地址不会连续

由于地址不是连续的,所以当用迭代器访问元素时,不能使用迭代器++、+1之类的操作

 

二、基本使用

构造与初始化 

list<int> L;//声明一个存放int类型的链表 

list<char> L;// 声明一个存放char类型的链表 

list<string> L;//声明一个存放string类型的链表 

list<int> L{1,2,3} //声明一个链表初始化为1,2,3 

list<int> L(n)    //声明一个n个元素的列表,每个元素都是0

list<int> L(n,m)  //声明一个n个元素的列表,每个元素都是m

list<int> L(first, last)  //声明一个列表,其元素的初始值来源于由区间所指定的序
//列中的元素,first和last是迭代器

-----------------------------------------------------------------------

插入
 
L.assign(n, val) //将L中的所有元素替换成n个val元素

L.push_back(n); //在L的尾部插入元素n 

L.push_front(n);//在L的头部插入元素n

L.insert(it,100); //在it位置(即头部)插入100, 

L.insert(it,2,100);//在it位置插入2个100, 

L.insert(it,b.begin(),b.end());//在it位置插入b从开始到结束的所有位置的元素
//it为迭代器,  insert会返回插入第一个元素的位置

----------------------------------------------------------------------

删除 

L.erase(it);    //将L中it位置的元素删除

L.erase(it1,it2); //将L中[it1,it2)之间的元素删除

L.pop_back();  //将L中最后一个元素删除 

L.pop_front(); //将L中第一个元素删除

L.clear();//清空L中所有元素

L.unique();//删除相邻的重复元素

L.remove(n);//删除L中所有值为n的元素 

L.resize(n);//取L中前n个元素,剩下的全部删除

L.resize(n,m);//分情况 
//如果n大于原来的元素个数,后面补元素m若干个,补到L中n个元素为止
//如果n小于原来的元素个数, 取L中前n个元素,剩下的全部删除

--------------------------------------------------------------

访问 

for(auto &x:L) cout<<x<<' ';//佛系遍历法,适合所有容器

list<int>::iterator it=L.begin(); cout<<*it;//访问第一个元素

next(it)//返回it的下一个元素的地址 cout<<*next(it); c++11 

L.front();//返回L中第一个元素 

L.back();//返回L的最后一个元素 

---------------------------------------------------------------

查找
 
find(L.begin(),L.end(),n);//查找,返回L中第一次出现的n的迭代器

----------------------------------------------------------------

其他
 
L.size();//返回元素个数 

L.empty();//是否为空 

L.merge();//合并两个容器,前提要有序 

L.begin();//返回头部迭代器 

L.end();//返回尾部迭代器 

L.swap(La);//交换两个容器 














 

 

 

 

### 如何在 Keil 中实现和使用链表 为了在 Keil 环境下有效地实现和使用链表,可以借鉴常见的 C 语言链表实现方式。下面展示了一种基于单链表的简单实现方案。 #### 单链表节点定义 首先定义链表中的节点结构体 `TLucyItem` 和链表头部结构体 `TslistHead`: ```c #include <stdio.h> #include <stdlib.h> // 用户自定义的数据结构 typedef struct tagYourData { int a; int b; } TYourData; // 链表节点结构体 struct TLucyItem { TYourData data; struct TLucyItem *next; // 指向下一个节点的指针 }; // 定义链表头结构体 typedef struct TslistHead { struct TLucyItem *first; // 指向链表的第一个元素 } TslistHead; ``` #### 初始化链表 创建并初始化一个新的链表实例: ```c void init_list(TslistHead *head) { head->first = NULL; } ``` #### 向链表中添加新节点 编写函数用于在链表末尾追加新的节点: ```c void append_node(TslistHead *head, TYourData newData) { struct TLucyItem *newNode = (struct TLucyItem *)malloc(sizeof(struct TLucyItem)); newNode->data.a = newData.a; newNode->data.b = newData.b; newNode->next = NULL; if (!head->first) { head->first = newNode; } else { struct TLucyItem *current = head->first; while (current->next != NULL) { current = current->next; } current->next = newNode; } } ``` #### 遍历打印链表内容 提供一个遍历整个链表并将各节点数据输出的功能: ```c void print_list(const TslistHead *head) { const struct TLucyItem *current = head->first; printf("List contents:\n"); while (current != NULL) { printf("a=%d, b=%d\n", current->data.a, current->data.b); current = current->next; } } ``` #### 测试代码片段 最后,在主函数中测试上述功能: ```c int main() { TslistHead myList; init_list(&myList); TYourData item1 = { .a=10, .b=20 }; TYourData item2 = { .a=30, .b=40 }; append_node(&myList, item1); append_node(&myList, item2); print_list(&myList); return 0; } ``` 此段代码展示了如何在一个简单的嵌入式环境中通过 Keil 实现基本的单链表操作[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值