C_线性表----list双向链表容器



在编程语言中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;
}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值