数据结构与算法分析笔记(c++)_双向链表(list)的实现

回顾一下,前面提到的ist类将要作为双向链表来实现,并且我们需要修改指向表两端的指针。只要操作是发生在已知位置,这样做就可以保证每个操作的时间消耗为常量。这个已知位置可以是末尾,也可以是迭代器指定的位置。
考虑到设计需要,我们需要提供下面的4个类:
(1)List类本身。包含连接到表两端的链接、表的大小以及一系列的方法
(2)Node类。该类看起来像是私有的嵌套类。一个结点包含数据和用来指向其前和其后的结点的指针,以及适当的构造函数。
(3)const iterator类。该类抽象了位置的概念,是一个公有的嵌套类。const iterator存储指向当前结点的指针,并且提供基本迭代器操作的实现,以及所有的重载操作符,例如=、==、!=、++
(4)iterator类。该类抽象了位置的概念,是一个公有的嵌套类。除了Operator *操作返回所指向项的引用,而不是该项的常量引用的功能外,lterator具有与 const_i terator相同的功能。一个重要的技术点是 iterate可以用于任何需要使用 const iterator的例程里,反之则不是。
因为迭代器类存储指向“当前结点”的指针,并且尾部标志是一个有效的位置,这使得在表的末尾添加一个额外的结点来作为尾部标志成为可能。这些额外的结点有时被称为哨兵结点;特别地,在头部的结点有时候称为表头结点(header node),而在末端的结点称为尾结点(tail node)
使用这些额外结点的好处是可以去掉很多特例,这极大地简化了程序代码。例如,如果我们不使用表头结点,那么删除第一个结点将成为一个特例
在这里插入图片描述
在这里插入图片描述
观察第5行私有嵌套的Node类的声明的开始部分,可以看到这里使用了 struct而不是使用c1ass关键字。在C++中,struct是C编程语言遗留下来的产物。C++中的 struct在本质上来说就是其成员默认为公有的class(class默认成员是私有)。经常可以看到程序员在声明一个大部分数据需要直接访问而不是使用方法来访问的类型时使用 struct。
观察第9行的公有嵌套的 const_iterator类的声明的开始部分和第12行公有嵌套的iterator类的声明的开始部分,可以看到这里有一个不常见的语法 inheritance(继承)(这是一个功能强大的结构,在本书的其他部分则没有用到)。继承语法是说,iterator具有与const iterator完全相同(有可能会多一些)的功能,并且 iterator与 const iterator的数据类型是完全兼容的。所有需要使用 const_iterator的地方都可使用 iterator。在以后遇到实际的实现的时候我们再讨论这些细节。
List类的其他部分包括构造函数、三大函数和一些方法。许多的方法都是一行的。begin和end返回适当的迭代器;第26行的调用是一个典型的实现,在实现中返回一个已构造的迭代器这样 iterator和 const iterator类每一个都有自己的构造函数,该构造函数使用指向Node的指针作为参数)。
第39~43行的clea方法执行的时候重复地执行删除操作来删除每一项,直到List变为空的为止。使用这种策略可以避免c]ear染揩结点空间的囻收。现在结点空间的回收已经归入pop front来执行。

在这里插入图片描述
第44~59行的方法都是通过巧妙地包含和使用恰当的迭代器来工作的。回顾
第70~72行是List的数据成员,命名了指向表头结点和尾结点的指针。我们也将记录数据成员的大小,这样一来size方法就可以在常量的时间内实现。
在这里插入图片描述
在这里插入图片描述
在第10~21行,可以看到 operator++的实现。回想在语法上前缀和后缀版本的operator+是完全不同的。因此,需要对不同的形式分别来编写例程。它们拥有相同的名字,因此必须用不同的符号来区分。C+需要通过给前缀形式指定空参数表,给后缀形式指定…个名的)int参数来赋予前缀和后缀形式以不同的标识。这个int参数永远也不使用,其存在的意义仅仅在于给出一个不同的标识。
在第28和29行,const_iterator像存储它的单一数据成员一样存储指向“当前”结点的指针。成员为 protected的,将允许从 const iterator继承的类具有访问这些成员的权限
在第34和35行是 const iterator的构造函数。该构造函数在List类的 begin和end的实现中用到。我们希望这个构造函数是被保护的。然而,这个保护没有提供List类访问这个构造函数的权限。解决的方案是第37行的友元声明(friend declaration)。该声明允许List类访问 const iterator的非公有成员
在这里插入图片描述
39行的语法即是称为继承性的高级特性。这也就意味着 iterator就是 const iterator。当iterator类使用这样的方式来编写时,该类就从 const_lterator继承了所有的数据和方法。可以对 lterator类添加新的数据或添加新的方法,以及覆盖(例如重新定义)已有的方法。
iterator中,修改函数必须显式实现,因为不这样的话原始的实现就会被新加的修改函数隐藏
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值