在编程语言中List 是类库中的一个类,可以简单视之为双向连结串行,以线性列的方式管理物件集合。list 的特色是在集合的任何位置增加或删除元素都很快,但是不支持随机存取。list 是类库提供的众多容器(container)之一。
参考list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素。在STL中,list和vector一样,是两个常被使用的容器。和vector不一样的是,list不支持对元素的任意存取。list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front、pop_front,这是vector不具备的。和vector另一点不同的是,list的迭代器不会存在失效的情况,他不像vector会保留备份空间,在超过容量额度时重新全部分配内存,导致迭代器失效;list没有备份空间的概念,出入一个元素就申请一个元素的空间,所以它的迭代器不会失效。(与vector区别参考来自百度百科)
list容器实现了双链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入、删除和查找都是极快速的。
由于list对象的结点并不要求在一段连续的内存中,所以,对于迭代器,只能通过“++”或“--”的操作将迭代器移动到后续/前驱结点元素处。而不能对迭代器进行+n或-n的操作,这点,是vector等不同的地方
list实现的基本函数:
/*创建空链表*/
list<int> l;
/*创建具有n个元素的链表*/
list<int> l(10);
/*添加元素*/
l.push_front();
l.push_back();
/*删除元素*/
l.pop_front();
l.pop_back();
/*移除链表中相同的一个元素*/
l.remove();
/*剔除连续重复元素让链表中只保留一个*/
l.unique();
/*返回得到链表的长度*/
l.size();
/*清空链表*/
l.clear();
/*链表元素查找*/
l.find();
/*元素排列(升序)*/
l.sort();
嗯下面是在VC中的测试:
#include<list>
#include<stdio.h>
#include<algorithm> //find()查找算法时需要包含的语句
using namespace std;
int main()
{
int k;
int m;
int ch;
list<int> l;
list<int>::iterator it,it2;
printf("请输入要链表中开始元素的个数:");
scanf("%d",&k);
printf("请依次输入链表中元素的值:");
for(int i=0;i<k;i++)
{//依次添加到链表首节点
scanf("%d",&m);
l.push_front(m);
}
printf("****************************\n");
printf("0、退出操作\n");
printf("1、链表排序\n2、清空链表\n3、结点查找\n");
printf("4、加入结点\n5、删除结点\n6、返回链表长度\n");
printf("7、移除相同结点\n8、正序遍历链表\n");
printf("****************************\n");
printf("请输入要选择的操作:");
while(scanf("%d",&ch)&&ch!=0)
{
if(ch==1){
l.sort();
printf("链表升序排列成功!\n");
}
if(ch==2){
l.clear();
printf("成功清除链表内元素!\n");
}
if(ch==3){
int n;
printf("请输入要查找的结点:");
scanf("%d",&n);
it=find(l.begin(),l.end(),n);
if(it!=l.end())
{
printf("链表中查找到该结点!\n");
}else{
printf("链表中没有查找到该结点!\n");
}
}
if(ch==4){
printf("1、加入链表首部\n");
printf("2、加入链表尾部\n");
printf("3、加入链表中间\n");
int n;
int choose;
printf("请选择加入结点的位置:");
scanf("%d",&choose);
if(choose==1){
printf("请输入要加入到链表中的数:");
scanf("%d",&n);
l.push_front(n);
printf("添加成功!\n");
}else if(choose==2){
printf("请输入要加入到链表中的数:");
scanf("%d",&n);
l.push_back(n);
printf("添加成功!\n");
}else if(choose==3){
printf("请输入选择加入的位置:");
int set;
scanf("%d",&set);
printf("请输入要加入到链表中的数:");
it=l.begin();
for(int i=1;i<set;i++)
{
it++;
}
l.insert(it,n);
printf("添加成功!\n");
}else{
printf("选择输入的值无效!\n");
}
}
if(ch==5){
printf("1、删除链表首部\n");
printf("2、删除链表尾部\n");
int choose;
printf("请选择加入结点的位置:");
scanf("%d",&choose);
if(choose==1){
l.pop_front();
printf("首元素删除成功!\n");
}else if(choose==2){
l.pop_back();
printf("尾元素删除成功!\n");
}else{
printf("输入的值无效!");
}
}
if(ch==6){
printf("链表长度大小为%d\n",l.size());
}
if(ch==7){
int n;
printf("请输入要移除链表中的值:");
scanf("%d",&n);
l.remove(n);
}
if(ch==8){
for(it=l.begin();it!=l.end();it++){
printf("%d ",*it);
}
printf("\n");
}
printf("请输入要选择的操作:");
}
printf("退出成功!\n");
return 0;
}