1. 程式人生 > >C++單鏈表型別模板

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】。