第3章 链表
使用向量带来的问题之一便是:在每次修改向量大小的时候,都需要分配和释放存储空间,从而产生内存碎片。如果减少重新改变向量大小的次数,先分配元素块,然后再删除元素块,那么向量则会占用超出需要的更多空间。
如果希望数据结构不多不少仅仅占用正好满足需要需要的那么多存储空间,并且不希望直接访问数据结构中的对象,那么可以使用链表。链表表示以某种已知的顺序将对象串接在一起。访问从链表的第一个对象开始,然后继续下一个对象。换句话说,同数组和向量的直接访问相比较而言,链表是一种顺序访问的数据结构。
3.1 基本链表操作
为了建立一个链表,需要一个指向链表第一个对象的链表管理器对象。然后,链表中的每一个对象都指向下一个对象(最后一个对象不指向任何对象)。因为链表要求对象包含一个指向下一个对象的指针,建立一个被列出对象以外的链表就意味着在对象的类中添加一个变量,在其中包含指向下一个对象的指针。如果某对象参与了多个链表。那么它必须拥有其他的不同变量,以分别指向它在每个链表中的相邻对象。
为了避免向实体类(数据结构最常处理的类)添加指针,链表(以及其他更复杂的数据结构)通常由一个节点(node)列表组成。节点是一个对象,它包含了指向列表中下一个节点的指针,以及指向作为列表一部分的对象的指针。
为了让上述概念更容易理解,请看图3-1,,该图展示了一个单链表(只有指向前方的指针)。链表管理器对象指向头节点。每一个后续节点都指向列表中的下一个节点。每一个节点还指向它所链接的对象。
链表管理器对象--------节点1(--对象1)节点2(——对象2) --------节点3(--对象3)------节点4(--对象4)-----节点5-(--对象5)----节点6(—对象6)
图3.1
通过使用节点对象,不必修改被链接的对象以使其包含指针。实际上,对象并不知道它是否是多个列表的一部分。
对链表元素的访问必须依照指针进行。因此,访问必须从链表管理器开始,因为它提过了对链表头节点的访问。无论是显示所有元素的信息,还是查找一个特定的元素,都必须使用顺序访问方法。对于链表,没有任何较为快速的方法可供使用。
链表以某种方式对元素进行进行排序。最典型的一种方式是元素以某些关键字进行排序。例如,如果有一个在类中进行登记的人员列表,可能会以人员姓名的字母顺序加以排序。也可以按照年代顺序或者数字顺序进行排序,具体采用哪种排序方法要根据希望采用的链表内容方式而定。如果以某种方式对链表进行了排序,必须能够在链表的任何一个地方插入新的元素。本章后面的部分会提供一个插入元素的例子。
从链表中删除元素所产生的内存碎片比从数组中执行元素删除操作所产生的碎片要少。只需简单地重新调整某些节点的指针,然后从内存中删除节点对象就可以了。如果程序仍然需要使用被节点应用的对象,对象可以继续保存在内存中。
3.2 单链表
如图3-1所示的单链表易于维护,因为每个节点只有一个指针。但是这种做法也有某些缺陷,因为所有的访问都必须以正向进行。尽管如此,单链表还是为学习链表的工作方式提供了一个很好的节点。
单链表的示例程序只能够做三件事情(参见图3-2):向链表添加元素、从链表中删除元素以及按照链表顺序显示元素。
1. Add an element
2. Remove an element
3. View element
4. quit
choice:
3.2.1 链表的Mix-in类
被链接的对象来自Thing类(程序3-1和程序3-2),并且按照thing_id变量进行排序。这种情况下,Thing 继承自一个名为力Listable的Max-In类,该类再一次采用了getkey函数(程序3-2和程序3-4)。
【程序3-1】链表所使用的Thing类的声明
#ifndef THING
#define THING
#include “listable.h”
class Thing :public listable
{
private :
int thing_id;
char thing_name[20];
public :
T
Thing(int,char[]0;
Int getID();
Char*getName();
Int getKey();
};
#endif
【程序3-2】链表所使用Thing类的具体实现
#include “Thing.h”
#include <string.h>
Thing::Thing( )
{
}
Thing::Thing(int Iid,char iName[])
{
thing_id=Iid;
strncpy(thing_name,iName,strlen(thing_name();
}
int Thing::getID()
{
return thing_id;
}
Char*Thing::getname()
{
Return thing_name;
}
int Thing::getKey()
{
Return thing_id;
}
【程序3-4】Listable 类的具体实现
#includes“listable.h”
Listable::Listable( )
{
//this does nothing
}
(连载中……摘自《面向对象c++数据结构》,【美】Jan Harrington 著,陈博译,科学出版社)
(声明:以上所有内容仅作为团队学习之用,不作任何商业用途)