链表

1.表ADT(abstract data type):

处理形如A0,A1,···,An-1 的一般的表,这个表的大小是N,大小为0的表为空表。

对于除空表以外的任何表,我们说Ai后继Ai-1并称Ai-1(i<N)前驱Ai(i>1)。

                                        图1 一个链表

 

链表由一系列不必在内存中相连的节点组成,每个元素均含有表元素和到包含该元素后继元的结点的链,我们称之为next链,最后一个单元的next链指向NULL。为了printList()或find(x),只需要从表的第一个结点开始然后用next链遍历该表即可。

remove方法可以通过修改一个next引用来实现 ,下图给出在原表中删除第二个元素的结果:

                                        图2 从聊表中删除

insert方法需要使用new操作符从系统取得一个新节点,此后执行两次引用调整,一般的,如果知道发生变化的位置,从链表中插入和删除一个元素不需要移动很多的元素,只是对结点链接进行固定的几个改变。

                                        图3 向链表插入

由于单项链表保持至表的两端的链接,删除最后一项有点麻烦,因为必须找到最后项的前面项,更改其next链接到NULL,然后更新这个保持为最后一项的链接,在单项链表中,每个结点存储指向下一结点,但是没有提供关于上一个结点的任何信息,取而代之,我们将链表中的每一个结点都添加一个指向上一项的链接,称之为双向链表。

                                       图4 双向链表

STL中的表

表ADT有两个流行的实现

  • vector给出了表ADT的可增长的数组实现。vector的优点是其在常量的时间是可索引的,缺点是插入和删除已有项的代价是昂贵的除非是这些操作发生在vector的末尾。
  • list提供了表ADT的双向链表实现,优点是如果发生变化的位置已知的话,插入新项和删除已有项的代价是很小的,缺点是不容易索引。

    vector和list两者在查找时效率都很低。

  示例 对表使用erase:

      该示例从表的起始项开始间隔地删除项,例如,如果表包含6,5,1,4,2,调用该方法后只包含5和4,对于list来说,400000项数据,花费0.06s,800000项的数据,花费0.125s;对vector来说,400000项数据,花费两分钟,800000项的数据,花费十分钟。

 

 1 #include <iostream>
 2 #include <vector>
 3 #include <cstdio>
 4 #include <iterator>
 5 #include <list>
 6 #include <iosfwd>
 7 
 8 /*间隔删除元素*/
 9 template <typename Container>
10 void removeEveryOtherItem(Container & lst)
11 {
12     typename Container::iterator itr = lst.begin();
13     while (itr != lst.end())
14     {
15         itr = lst.erase(itr);
16         if (itr != lst.end())
17             itr++;
18         //std::cout << "删除后: " << itr << std::endl;
19     }
20     
21 
22 }
23 /*打印任何集合*/
24 template<typename Container>
25 void printCollection(const Container & c, std::ostream &out = std::cout)
26 {
27     if (c.empty())
28         out << "(empty)";
29     else
30     {
31         typename Container::const_iterator itr = c.begin();
32         out << "[" << *itr++;
33         while (itr!=c.end())
34         {
35             out << "," << *itr++;
36         }
37         out << "]" << std::endl;
38     }
39 }
40 
41 void main()
42 {
43     std::list<int> A;
44     if (A.empty())
45     {
46         for (int i = 0; i < 10; i++)
47         {
48             A.push_back(i);
49         }
50     }
51     else
52     {
53         A.clear();
54         for (int i = 0; i < 10; i++)
55         {
56             A.push_back(i);
57         }
58     }
59     printCollection(A);
60     removeEveryOtherItem(A);
61     printCollection(A);
62     system("pause");
63 }
View Code

 

posted on 2016-10-27 20:19  wode未来  阅读(201)  评论(0)    收藏  举报