??????? 线性表:链式存储结构实现之一代码(构造,遍历,析构)
??????? 为了大家学习,便于掌握,将线性表的链式存储结操作算法分开讨论。本代码讨论“构造”链表操作、遍历操作和析构操作。
???? ?? 本代码,代码放到一个文件里。大家可以将源码中三个模块分别放到三个文件,像顺序存储实现一样。更利于代码的灵活应用。
#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( ); //显示链表中所有元素 }
注意的是:构造函数和析构函数由系统自己调用。