第五章 一个单向链表实例

本章以一个单向链表来结尾

链表是一个数据项序列,每个数据项都包含了一个某种类型的值和链表下一项的地址,地址可以为空,链表也可以为空。即链表中可以没有数据项。链表不可能为满,但是当程序的空闲存储区被耗尽时,试图创建一个新的链表项会失败。


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 )。


以上讲的就是链表需要实现的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值