链表
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 }
浙公网安备 33010602011771号