7、群体类和群体数据的组织-3、顺序访问群体--链表类
链表是一种动态数据结构,可以用来表示顺序访问的线性群体。
链表的第一个结点称为头结点,最后一个结点称为尾结点,尾结点的后继指针为空(NULL)。
1、结点类
链表的结点包括数据和指针域,是链表的基本构件。结点的数据域用于存放群体中元素的内容。即可以是若干个基本类型的数据,也可以是自定义类型的数据,甚至是内嵌对象。结点的指针域用于存放链表中另一个结点的地址。
结点类的数据成员中应该包括数据域和指针域的内容,函数成员中应该含有对数据和指针进行初始化的方法(函数),以及在本结点之后插入新结点和删除后继结点的方法。
lianbiao.h文件
#ifndef NODE_CLASS
#define NODE_CLASS
//类声明部分
template <class T>
class Node {
private: Node<T> *next;//指向后继结点的指针
public: T data;//数据域
Node(const T& item, Node<T> * ptrnext = NULL);//构造函数
void InsertAfter(Node<T> *p);//本结点之后插入一个同类结点p
Node<T> *DeleteAfter(void);//删除本结点的后继结点,并返回其地址
Node<T> *NextNode(void) const;//获取后继结点的地址
};
//类的实现部分
//构造函数,初始化数据和指针成员
template <class T> Node<T>::Node(const T& item, Node<T> *ptrnext) :data(item), next(ptrnext)
{}
//返回后继结点的指针
template <class T> Node<T> *Node<T>::NextNode(void) const
{ return next; }
//在当前结点之后插入一个结点p
template <class T> void Node<T>::InsertAfter(Node<T> *p)
{ p->next = next;//p结点指针域指向当前结点的后继结点
next = p;//当前结点的指针域指向p
}
//删除当前结点的后继结点,并返回其地址
template<class T> Node<T> *Node<T>::DeleteAfter(void)
{ Node<T> *tempPtr = next; //将欲删除的结点地址存储到tempPtr中
if (next == NULL) //如果当前结点没有后继结点,则返回NULL
return NULL;
next = tempPtr->next;//使当前结点的指针域指向tempPtr的后继结点
return tempPtr;//返回被删除的结点的地址
}
#endif //NODE_CLASS
2、链表类
建立链表和遍历链表以及插入和删除结点是应用程序中广泛使用的节本链表算法。按照面向对象的方法,将结点与操作封装起来,便构成链表类。
1)链表类的数据成员
在访问链表过程中,有一个当前结点以及伴随结点,后者是指始终指向当前结点的前趋结点,以配合完成结点的插入、删除等操作。
综上,在链表类的数据成员中,需要保存表头指针、表尾指针、元素个数、当前的遍历位置 等信息。
2)链表类的成员函数
链表的基本操作应该包括:生成新结点、插入结点、删除结点、访问/修改结点数据、遍历链表等。
因此,在链表类中应该包含完成上述操作的成员函数,以及为了实现这些函数而添加的一些辅助函数,为了方便链表类对象间的赋值,还应重载“=”运算符。另外,由于面向对象的封装特性,当然还要提供一些接口函数。