码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-23 00:47:33      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:c++   stl   标准模板库   c++ primer   

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

list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入、删除和查找都是超快速的。下图是双向循环链表的结构示意图。

技术分享

       list的每个节点有三个域:前驱元素指针域、数据域和后继元素指针域。前驱元素指针域保存了前驱元素的首地址;数据域则是本节点的数据;后继元素指针域则保存了后继元素的首地址。list的头结点的前驱元素指针域保存的是链表中尾元素的首地址,而list的尾节点的后继元素指针域则保存了头节点的首地址,这样,构成了一个双向循环链。

       由于list对象的节点并不要求在一段连续的内存中,所以,对于list迭代器,只能通过“++”或“- -”的操作将迭代器移动到后继/前驱节点元素处。而不能进行+n或-n的操作,这是与vector等不同的地方。

 

1、创建list对象

(1)创建空链表

list<int>num;

(2)创建具有n个元素的链表

list<int>num(10);

 

2、元素插入和遍历

有三种往链表里插入新元素

(1)采用push_back()方法往尾部插入新元素,链表自动扩张。

(2)采用push_front()方法往首部插入新元素,链表自动扩张。

(3)采用insert()方法往迭代器位置处插入新元素,链表自动扩张。注意:只能进行“++”或“- -”的操作。

#include <iostream>
#include <list>
 
using namespace std;
 
int main(int argc, char* argv[])
{
   list<int> num;
   num.push_back(1);
   num.push_back(2);
   num.push_front(8);
   list<int>::iterator iter = num.begin();
   iter++;
   num.insert(iter, 20);
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << endl;
   return 0;
}

运行结果:

8

20

1

2

 

3、反向遍历

#include <iostream>
#include <list>
 
using namespace std;
 
int main(int argc, char* argv[])
{
   list<int> num;
   num.push_back(1);
   num.push_back(2);
   num.push_back(3);
   list<int>::reverse_iterator iter = num.rbegin();
   for(iter = num.rbegin(); iter != num.rend(); iter++)
       cout << *iter << " ";
   return 0;
}

运行结果:

3 2  1

 

4、元素删除

(1)可以使用remove()方法删除链表中一个元素,值相同的元素都会被删除。

#include <iostream>
#include <list>
 
using namespace std;
 
int main(int argc, char* argv[])
{
   list<int> num;
   num.push_back(1);
   num.push_back(2);
   num.push_back(3);
   num.push_back(1);
   list<int>::iterator iter = num.begin();
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   cout << endl;
   num.remove(1);
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   return 0;
}

运行结果:

1 2  3  1

2  3

 

(2)使用pop_front()方法删除链表首元素,使用pop_back()方法删除链表尾元素

#include <iostream>
#include <list>
 
using namespace std;
 
int main(int argc, char* argv[])
{
   list<int> num;
   num.push_back(1);
   num.push_back(2);
   num.push_back(3);
   num.push_back(1);
   list<int>::iterator iter = num.begin();
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   cout << endl;
   num.pop_front();
   num.pop_back();
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   return 0;
}

运行结果:

1 2  3  1

2  3

 

(3)使用erase()方法删除迭代器位置上的元素

#include <iostream>
#include <list>
 
using namespace std;
 
int main(int argc, char* argv[])
{
   list<int> num;
   num.push_back(1);
   num.push_back(2);
   num.push_back(3);
   num.push_back(1);
   list<int>::iterator iter = num.begin();
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   cout << endl;
   //删除第2个元素(从0开始计数)
   iter = num.begin();
   iter++;
   iter++;
   num.erase(iter);
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   return 0;
}

运行结果:

1 2  3  1

1 2  1

 

(4)使用clear()方法清空链表

#include <iostream>
#include <list>
 
using namespace std;
 
int main(int argc, char* argv[])
{
   list<int> num;
   num.push_back(1);
   num.push_back(2);
   num.push_back(3);
   num.push_back(1);
   list<int>::iterator iter = num.begin();
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   cout << endl;
   num.clear();
   cout << num.size() << endl;
   return 0;
}

运行结果:

1 2  3  1

0

 

5、元素查找

       采用find()查找算法可以在链表中查找元素,如果找到该元素,返回的是该元素的迭代器位置;如果没有找到,则返回end()迭代器位置。

       find()算法需要声明“#include <algorithm>”

#include <iostream>
#include <list>
#include <algorithm>
 
using namespace std;
 
int main(int argc, char* argv[])
{
   list<int> num;
   num.push_back(1);
   num.push_back(2);
   num.push_back(3);
   num.push_back(1);
   list<int>::iterator iter = num.begin();
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   cout << endl;
   iter = find(num.begin(), num.end(), 3);
   if(iter != num.end())
       cout << "find it" << endl;
   else
       cout << "not find it" << endl;
   iter = find(num.begin(), num.end(), 5);
   if(iter != num.end())
       cout << "find it" << endl;
   else
       cout << "not find it" << endl;
   return 0;
}

运行结果:

1 2  3  1

find it

not find it

 

6、元素排序

采用sort()方法可以对链表元素进行升序排序

#include <iostream>
#include <list>
#include <algorithm>
 
using namespace std;
 
int main(int argc, char* argv[])
{
   list<int> num;
   num.push_back(1);
   num.push_back(2);
   num.push_back(3);
   num.push_back(1);
   list<int>::iterator iter = num.begin();
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   cout << endl;
   num.sort();
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   return 0;
}

运行结果:

1 2  3  1

1 1  2  3

 

7、剔除连续重复元素

       采用unique()方法可以剔除连续重复元素,只保留一个。

#include <iostream>
#include <list>
#include <algorithm>
 
using namespace std;
 
int main(int argc, char* argv[])
{
   list<int> num;
   num.push_back(1);
   num.push_back(2);
   num.push_back(3);
   num.push_back(1);
   list<int>::iterator iter = num.begin();
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   cout << endl;
   //一般是先排序,后去重
   num.sort();
   num.unique();
   for(iter = num.begin(); iter != num.end(); iter++)
       cout << *iter << " ";
   return 0;
}

运行结果:

1 2  3  1

1 2  3



参考 :

《C++ primer 第四版》

《ACM程序设计》


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

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

标签:c++   stl   标准模板库   c++ primer   

原文地址:http://blog.csdn.net/keyyuanxin/article/details/47011551

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!