list双向链表容器应用基础(创建、遍历、插入、删除、归并、排序及连续重复元素剔除等)

不同于采用线性表顺序存储结构的vector和deque容器,list双向链表中任一位置的元素差值、插入和删除,都具有高效的常数阶算法时间复杂度O(1)。

头文件

#include<list>

创建list对象

1)list();//创建一个没有任何元素的list对象。

list<int>l 

2)list(size_type n);//创建一个具有n个元素的list对象,每个元素采用它的类型下的默认值。

list<int>l(10);//list对象l有10个元素,每个元素初始值为。

3)list<size_type n, constT& value); //创建一个具有n个元素的list对象,这些元素的初始值为value。

list<double>l(10,5.6); 

4)list(const list&);//list的拷贝构造函数,通过拷贝一个list对象的元素值,创建一个新的list对象。

list<char>l1(5,’a’);
list<char>l2(l1); 

5)list(const InputIterator first, const InputIterator last,const A& a=A());

//将迭代区间[first,last)所指的元素拷贝到一个新创建的list对象中,其中内存分配器可缺省。

//利用int数组iArray,创建一个list对象l
intiArray[]={1,2,3,4,5,6,7};
list<int>l(iArray, iArray+7); // 创建list对象

初始化赋值

利用list提供的push_back函数,可将元素依次链入链表中。push_back函数常用于list容器的初始化。

元素的遍历访问

由于链表中元素需要一个个元素遍历,因此,list元素的遍历只能使用迭代器的方式进行。

#include <iostream>
#include <list>
using namespace std;
int main ()
{
	int Array[] = {16,2,77,29};
	//用上面第五种方式创建list对象
	list<int> mylist(Array,Array+sizeof(Array)/sizeof(int));
	//遍历输出
	for (list<int>::iterator it = mylist.begin(); it != mylist.end(); it++)
		std::cout << *it << ' ';
	std::cout << '\n';
	return 0;
}

list链表元素的插入

由于list链表元素的插入不需要对其他元素进行移位拷贝,因此list元素的插入函数是有常数阶的O(1)算法时间复杂度。

voidpush_front(constT&);//头部插入

iteratorinsert(iterator pos, const T& x);//pos位置之前,插入新元素x

具体实例与前篇deque的应用相似,这里不再多说。

list链表元素的删除

list同样具有高效的链表元素删除处理,包括删除首元素pop_front函数、删除尾元素的pop_back函数,删除任意位置或迭代区间上元素的erase函数,以及删除所有元素的clear函数。

1)void pop_front();//删除 list的第一个链表元素

2)void pop_back();//删除 list的最后一个链表元素

3)iteratorerase(iterator pos);//删除 pos所指向的链表元素

4)iteratorerase(iterator first, iterator last);//删除迭代器区间 [first, last)所指向的所有链表元素

5)void clear();//删除所有 list链表元素

6)void remove(constT& value);//删除 list链表中所有元素值为 value的元素

具体实例与前篇deque的应用相似,这里不再多说。

list链表的归并

list 链表元素的排序,是将 list链表分割成若干部分进行子排序,然后通过归并处理,实现 list的所有元素的排序。为此,list容器提供了
splice和 merge归并函数。

1)void splice(iterator position, list& x);//将 x的链表归并到当前 list链表的
position位置之前, list对象 x将被清空

void splice(iterator position, list& x, iterator i);//将一个 list的迭代器
i 值所指的元素,归并到当前 list列表中,并将被归并的元素从原链表中删除。

void merge(list& x);//将list对象 x的链表归并到当前
list链表中,并清空 x的链表。从merge 函数的源码可看出,只有当前 list链表和被归并的
x链表的元素,均预先按照元素值的 "<"关系排好,merge函数才具有意义,归并后的链表元素也是按 "<"关系排序的。

#include <list>
#include <iostream>
using namespace std;

void print(list<int>& l);
int main()
{
	list<int> l;
	list<int> carry;
	for (int j=1; j<=10; j++)
	{
		l.push_back(j);
	}
	// splice() 函数
	carry.splice(carry.begin(), l, ++l.begin());
	// 打印carry
	cout << "carry 的链表元素为: ";
	print(carry);
	// 打印l
	cout << "l 的链表的元素为:";
	print(l);
	// merge() 函数用法
	list<int> x;
	x.push_back(30);
	x.push_back(31);
	x.push_back(32);
	l.merge(x);
	// 打印x
	cout << "x 的链表元素为空";
	print(x);
	// 打印l
	cout << "l 的链表元素为:";
	print(l);
	return 0;
}
// list 链表打印
void print(list<int>& l)
{
	list<int>::iterator i, iend;
	iend = l.end();
	for (i=l.begin(); i!=iend; ++i)
		cout << *i << ' ';
	cout << endl << endl;
}

list的元素排序

list 提供的 void sort函数,按 "<"
关系进行 list链表元素排序,较小的元素排在前面。

#include <list>
#include <iostream>
using namespace std;
void print(list<int>& l);

int main()
{
	list<int> l;
	for(int j=18; j>=0; j--)
		l.push_back(j);
	cout << "排序前: " ; print(l);
	//调用list<int>::sort()函数排序
	l.sort();
	cout << "排序后: " ; print(l);
	return 0;
}
void print(list<int>& l)
{
	list<int>::iterator i,iend;
	iend=l.end();
	for(i=l.begin(); i!=iend; i++)
		cout << *i << ' ';
	cout << endl;
}

list的连续重复元素的剔除

利用 list 提供的 void unique函数,可将连续重复的元素删除。仅保留一个。

#include <list>
#include <iostream>
using namespace std;
int main(void)
{
	list<int> l;
	l.push_back(6);
	l.push_back(8);
	l.push_back(6);
	l.push_back(6);
	l.push_back(6);
	l.push_back(9);
	l.push_back(13);
	l.push_back(6);
	l.unique();
	list<int>::iterator i,iend;
	iend=l.end();
	for(i=l.begin(); i!=iend; i++)
		cout << *i << ' ';
	cout << endl;
	return 0;
}

此文为本人原创,转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46742541

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 22:58:22

list双向链表容器应用基础(创建、遍历、插入、删除、归并、排序及连续重复元素剔除等)的相关文章

c语言 双向链表的简单操作-创建、插入、删除

数据结构-双向链表的创建.插入和删除 双向链表是数据结构中重要的结构,也是线性结构中常用的数据结构,双向指针,方便用户从首结点开始沿指针链向后依次遍历每一个结点,结点的前驱和后继查找方便. #include <stdio.h> #include <stdlib.h> //双向链表结点的定义 typedef struct dbnode { int data; struct dbnode *prio, *next; }DbNode, linkdblist; //创建双向链表 DbNod

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历

可变数组:创建 添加 插入 删除 替换

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //可变数组继承不可变数组 //1创建 设定元素个数进行创建 NSMutableArray *str=[NSMutableArray arrayWithCapacity:7]; //2想数组中添加一个元素 NSArray *[email protected][@"MON",@"

用JQ实现基础的添加,插入,删除功能。

在eclipse里面运行代码即可,如果您是其他应用,请选择对您有帮助的代码即可,如果有写错或不懂的地方请联系QQ:1633420056,谢谢,祝学习进步 <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><script type="text/javascript" src=&qu

二叉搜索树的创建 &amp;&amp; 查找 &amp; 插入 &amp; 删除

二叉搜索树的删除: 在删除之前需要从树中查找到这个节点,然后再针对情况来判断如何删除. 分为三种情况,首先是此节点没有孩子节点,此节点有一个孩子节点,此节点有两个孩子节点 void Delete(BinTree*& root,int value) { BinTree* delnode= NULL; if(root == NULL) return ; BinTree* temp = root; BinTree* parent =NULL; while(temp!=NULL) { if(temp-&g

Python3基础 使用for循环 删除一个列表中的重复项

镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.------------------------------------------ code: num=[1,2,3,4,5,6,6,7,8] res=[] for each in num : if each not in res : res.append(each) print(res) #有趣有趣,这么写基础的机制与方法,可以写出如此优美的函数 #小甲鱼 强悍 res

[LeetCode] Insert Delete GetRandom O(1) - Duplicates allowed 常数时间内插入删除和获得随机数 - 允许重复

Design a data structure that supports all following operations in average O(1) time. Note: Duplicate elements are allowed. insert(val): Inserts an item val to the collection. remove(val): Removes an item val from the collection if present. getRandom:

C++ Primer 学习笔记_13_标准模板库_list双向链表容器

C++ Primer 学习笔记_13_标准模板库_list双向链表容器 list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入.删除和查找都是超快速的.下图是双向循环链表的结构示意图. list的每个节点有三个域:前驱元素指针域.数据域和后继元素指针域.前驱元素指针域保存了前驱元素的首地址:数据域则是本节点的数据:后继元素指针域则保存了后继元素的首地址.list的头结点的前驱元素指针域保存的是链表中尾元素的首地址,而list的尾

JavaScript之jQuery-3 jQuery操作DOM(查询、样式操作、遍历节点、创建插入删除、替换、复制)

一.jQuery操作DOM - 查询 html操作 - html(): 读取或修改节点的HTML内容,类似于JavaScript中的innerHTML属性 文本操作 - text(): 读取或修改节点的文本内容,类似于JavaScript中的textContent属性 值操作 - val(): 读取或修改节点的value属性值,类似于 JavaScript 中的value值 属性操作 - attr(): 读取或者修改节点的属性 - removeAttr(): 删除节点的属性 二.jQuery操作