C++單鏈表型別模板
單鏈表的概念和基本演算法請點選這裡:C++單鏈表的基本演算法
分析:考慮單鏈表的特點及其基本操作,可以將每個節點歸屬成一個節點類,該類的一個物件就是一個節點,凡與節點資料(或指向節點的指標)操作有關函式作為節點類成員函式,包括生成新節點、在當前節點後插入節點、在當前節點後刪除一個節點、……;
在節點類的基礎上,再定義連結串列類,該類的一個物件就是一個單鏈表,操作包括生成(建立)有序連結串列、搜尋遍歷、插入、刪除、取資料等;
template<typename T>class Node;//節點類宣告
template<typename T>class List; //連結串列類宣告
template<typename T>class Node
{
T info; //資料域
Node<T> *link; //指標域
public:
Node(); //生成頭節點的建構函式
Node(const T & data); //生成一般節點
void InsertAfter(Node<T>* p); //在當前節點後插入一個節點
Node<T>* RemoveAfter(); //刪除當前節點的後繼節點
friend class List<T>; //以List為友元類,List可直接訪問Node的私有成員
};//節點類模板宣告結束
以下是節點類的成員函式的定義
template <typename T> Node<T>::Node()
{
link=NULL;
} //此節點的資料域不用,僅作頭節點
template <typename T> Node<T>::Node(const T & data)
{
info=data; link=NULL;
} //設定當前節點
template<typename T> void Node<T>::InsertAfter(Node<T>* p)
{
p->link=link; link=p;
} //在當前節點後插入p
template<typename T> Node<T>* Node<T>::RemoveAfter()
{
Node<T>* tempP=link;
if(link==NULL)
tempP=NULL; //已在鏈尾,後面無節點
else
link=tempP->link;
return tempP; //從鏈中取出該節點並返回(可以作其他用)
}
//連結串列類宣告,操作包括建立有序連結串列、搜尋遍歷、插入、刪除、取資料等:
template<typename T>class List
{
Node<T> *head,*tail; //連結串列頭、尾指標
public:
List(); //建構函式,生成頭節點(空連結串列)
~List(); //解構函式
void MakeEmpty(); //清空一個連結串列,只餘表頭節點
Node<T>* Find(T data); //搜尋資料域與data相同的節點,返回該節點的地址
int Length(); //計算單鏈表長度
void PrintList(); //列印連結串列的資料域
void InsertFront(Node<T>* p); //在當前連結串列前插入新節點(向前生成連結串列)
void InsertRear(Node<T>* p); //在當前連結串列後插入新節點(向後生成連結串列)
void InsertOrder(Node<T> *p); //按升序要求在當前連結串列中插入新節點
Node<T>*CreatNode(T data); //建立一個節點(孤立節點)
Node<T>*DeleteNode(Node<T>* p); //從當前連結串列中刪除指定節點p並返回
};//連結串列類宣告結束
以下是連結串列類成員函式的定義
template<typename T>List<T>::List()
{
head=tail=new Node<T>();
}//將呼叫Node類構造
template<typename T>List<T>::~List()
{
MakeEmpty();
delete head;
}
template<typename T>int List<T>::Length()
{
Node<T>* tempP=head->link;
int count=0;
while(tempP!=NULL)
{
tempP=tempP->link;
count++;
}
return count;
}//算不算head節點?
……
其他成員函式程式碼略,請參見【例7.5_h】和【例7.5】。