目录
【单链表的概念】
【单链表类的设计】
【几点注意】
【各个功能函数的具体实现】
【单链表的概念】
相比于顺序表,每个结点增加了一个指针字段,如“next”,该指针指向它的直接后继结点,最后一个结点的next字段为空。一个数据结点由两个部分组成,一个是存储数据元素本身,另外一个存储它的直接后继元素的存储地址。我们对单链表附加了一个头结点,为了在单链表里面插入和删除操作更加方便。
【单链表类的设计】
template
class sLinkList :public list
{
private:
struct node//把结点类定义成struct类而不是class类
{
elemType data;//保存数据元素的部分
node* next;//指向下一个数据元素的指针
node(const elemType& x, node* n = NULL) { data = x; next = n; }
node():next(NULL){}
~node() {};
};
node* head;//指向头结点的一个指针
int currentLength;//数据的长度
node* move(int i)const;//保存了第i个结点的存储地址
public:
sLinkList()
{
head = new node;
currentLength = 0;
}//这个构造函数中没有把头结点的next指向null,是因为node类里面的缺省构造函数把next指向了null
~sLinkList() { clear(); delete head; }//析构函数
void clear();//清空单链表
int length()const { return currentLength; }//返回表长
void insert(int i, const elemType& x);//插入
void remove(int i);//删除
int search(const elemType& x)const;//查找
elemType visit(int i)const;//定位访问
void traverse()const;//遍历
};
【几点注意】
(1)代码段的第5行:
把结点类定义成struct类而不是class类,struct类默认访问权限都是公有的,方便单链表进行操作。这样的定义是安全的,因为struct类被我们定义到了单链表类的私有成员部分,用户仍然访问不到。
struct node
(2) struct结点类有两个构造函数:
node(const elemType& x, node* n = NULL) { data = x; next = n; }//初始化数据成员部分和next结点
node():next(NULL){}//将next结点置为NULL
(3)设置了一个表长currentLength:
当我们想要求表长的时候,需要从头到尾遍历一遍单链表,才能返回这个表的表长,这个操作的时间性能是很差的,那应该怎么解决呢?
我们想到一个方法,就是用空间换时间,所以我们增加了一个数据成员,来保存当前单链表的长度,随时对这个数据成员进行维护。
int currentLength;
(4)设计了一个工具函数move( int i ):
保存了第 i 个结点的存储地址,链表的插入、删除操作都需要将指针移到被操作结点的前一结点,通过函数move实现。(后面将会介绍move函数的具体实现过程)
node* move(int i)const;



