线性表:链式存储结构实现之一代码(构造,遍历,析构)
为了大家学习,便于掌握,将线性表的链式存储结操作算法分开讨论。本代码讨论“构造”链表操作、遍历操作和析构操作。
本代码,代码放到一个文件里。大家可以将源码中三个模块分别放到三个文件,像顺序存储实现一样。更利于代码的灵活应用。
#include<iostream> //引用输入输出流库函数的头文件
/*************************/
/***** 声明模板类 *****/
/*************************/
template <class DataType>
struct Node
{
DataType data;
Node<DataType> *next;
};
template <class DataType>
class LinkList
{
public:
LinkList( ); //构造函数,含头结点的空链表
LinkList(DataType a[ ], int n); //构造函数,建立有n个元素的单链表
~LinkList( ); //析构函数
void PrintList( ); //遍历操作,按序号依次输出各元素
private:
Node<DataType> *first; //单链表的头指针
};
/********************************/
/***** 定义模板类操作函数 *****/
/********************************/
template <class DataType>
LinkList<DataType> :: LinkList( )
{
first = new Node<DataType>; //生成头结点
first->next = NULL; //头结点的指针域置空
}
template <class DataType>
LinkList<DataType> :: LinkList(DataType a[ ], int n)
{
Node<DataType> *r, *s;
first = new Node<DataType>; //生成头结点
r = first; //尾指针初始化
for (int i = 0; i < n; i++)
{
s = new Node<DataType>; s->data = a[i]; //为每个数组元素建立一个结点
r->next = s; r = s; //将结点s插入到终端结点之后
}
r->next = NULL; //单链表建立完毕,将终端结点的指针域置空
}
template <class DataType>
LinkList<DataType> :: ~LinkList( )
{
Node<DataType> *q;
while (first != NULL) //释放每一个结点的存储空间
{
q = first; //暂存被释放结点
first = first->next; // first指向被释放结点的下一个结点
delete q;
}
}
template <class DataType>
void LinkList<DataType> :: PrintList( )
{
Node<DataType> *p = first->next; //工作指针p初始化
while (p != NULL)
{
cout << p->data<<" ";
p = p->next; //工作指针p后移
}
cout<<endl;
}
using namespace std;
/********************************/
/***** C++ 主函数 *****/
/***** 选定5个学生成绩 *****/
/********************************/
void main( )
{
int Score[5]={99, 93, 89, 76, 88};
LinkList<int> ScoreList(Score, 5);//会调用带参构造函数。
cout<<"链表数据为:"<<endl;
ScoreList.PrintList( ); //显示链表中所有元素
}
注意的是:构造函数和析构函数由系统自己调用。