本章以一个单向链表来结尾
链表是一个数据项序列,每个数据项都包含了一个某种类型的值和链表下一项的地址,地址可以为空,链表也可以为空。即链表中可以没有数据项。链表不可能为满,但是当程序的空闲存储区被耗尽时,试图创建一个新的链表项会失败。
2.链表类必须支持的操作有什么呢?
用户必须能能够插入(insert)或者删除(remove),以及查找(find)一个项。用户必须能够查找链表的长度(size),显示(display)链表,以及比较两个链表是否相等(equality)。另外,还要支持翻转(reverse)链表以及连接两个链表。
3.要得到size,size()最简单的方法是实现迭代链表,返回所遍历的元素的个数。复杂一点的实现,是将size作为一个数据成员储存起来。显然第二个实现的效率较高,它只是简单地返回相关联的成员。但是额外的复杂形势必须在每次插入和删除一个元素,都需要更新这个成员。本例采用的是第二种方案,把元素的个数保存在数据成员size中,并且必要时更新这个数据成员。
4.insert()操作有两个参数,一个是已存在元素的指针,另一个参数是需要插入的新值,它的功能是把这个新值插入到已知元素的后面。
比如:已知链表:1 1 2 3 8
如果我们调用了插入函数mylist.insert(pointer_to_3,5)则会把链表修改为:1 1 2 3 5 8.
为了丝线这个目的,我们必须向用户提供一种方法来访问某个特定的数据项的地址。比如pointer_to_3就是一个地址,我们这里提供了一种方法:find()。比如:pointer_to_3=mylist.find(3);
find()把待搜索的值作为它的参数,如果这个元素存在,则find()返回指向该元素的指针,否则返回0.
当然我们还希望支持两种特殊情况的inser(),在链表头或者链表尾插入。insert_front(value)和insert_end(value)
5.删除操作应该包括以下:删除单个值,删除最前面的元素,删除所哟的元素。
我们把它们分别写为如下函数:remove(value);remove_front();remove_all();
6.display()操作为链表提供一个格式化的输出,包括链表的长度,以及每个元素,空链表的显示如下:(0) ()
若有7个元素的链表显示为:(7) ( 0 1 1 2 3 5 8 )
7.reverse()只是翻转元素的顺序mylist.reverse();后的结果为(7)( 8 5 3 2 1 1 0 )
8.连接操作将第二个链表附加到第一个的末尾,例如,已知链表:
(4)( 0 1 1 2 ) // 链表1
(4)( 2 3 5 8 ) // 链表2
list1.concat( list2 );操作后将变为(8)( 0 1 1 2 2 3 5 8 )。
以上讲的就是链表需要实现的功能。