1. 程式人生 > >連結串列類模板

連結串列類模板

#include <iostream>
using namespace std;
class CNode  //定義一個節點類
{
public:
	CNode *m_pNext; //定義一個節點指標,指向下一個節點
	int m_Data;  //定義節點的資料
	CNode() //定義節點類的建構函式
	{
		m_pNext = NULL;//將m_pNext設定為空
	}
};
template <class Type> //定義類模板
class CList  // 定義CList類
{
private:
	Type *m_pHeader; //定義頭節點
	int m_NodeSum;  //節點數量
public:
	CList() //定義建構函式
	{
		m_pHeader = NULL; // 將m_pHeafer設定為空
		m_NodeSum = 0; // 將m_NodeSum設定為0
	}
	Type* MoveTrail()  //獲取尾節點
	{
		Type *pTmp = m_pHeader; //定義一個臨時節點,將其指向頭節點
		for (int i = 1; i < m_NodeSum; i++)  //遍歷連結串列
		{
			pTmp = pTmp->m_pNext; //將下一個節點指向當前節點
		}
		return pTmp; //返回尾節點
	}
	void AddNode(Type *pNode) //新增節點
	{
		if (m_NodeSum == 0) //判斷連結串列是否為空
		{
			m_pHeader = pNode; //在頭節點處新增節點
		}
		else					//連結串列不為空
		{
			Type* pTrail = MoveTrail(); //獲取尾節點
			pTrail->m_pNext = pNode;  //在尾節點處新增節點
		}
		m_NodeSum++;				//使節點數量加1
	}
	void PassList()					//遍歷連結串列
	{
		if (m_NodeSum > 0)			//判斷連結串列是否為空
		{
			Type* pTmp = m_pHeader;  //定義一個臨時節點,將其指向頭節點
			printf("%4d", pTmp->m_Data);   //輸出頭節點資料 printf("%4d",pTmp->m_Data); 表示m_Data 佔四位
			for (int i = 1; i < m_NodeSum; i++) 
			{
				pTmp = pTmp->m_pNext;   //獲取下一個節點
				printf("%4d",pTmp->m_Data); //輸出節點資料
			}
		}
	}
	~CList() //定義解構函式 
	{
		if (m_NodeSum > 0) //判斷連結串列是否為空
		{
			Type *pDelete = m_pHeader;  //定義一個臨時節點,將其指向頭節點
			Type *pTmp = NULL;	//定義一個臨時節點
			for (int i = 0; i < m_NodeSum; i++) //利用迴圈遍歷所有節點
			{
				pTmp = pDelete->m_pNext;	//將下一個節點指向當前節點
				delete pDelete;	//釋放當前節點
				pDelete = pTmp;	//將當前節點指向下一個節點
			}
			m_NodeSum = 0;	//設定節點數量為0
			pDelete = NULL;	 //將pDelete值為空
			pTmp = NULL;  //將pTmp值為空
		}
		m_pHeader = NULL;  //將m_pHeader值為空
	}
};
class CNet		//定義一個節點類 
{
public:
	CNet *m_pNext;	//定義一個節點類指標
	char m_Data;	//定義節點類的資料成員
	CNet()			//定義建構函式
	{
		m_pNext = NULL;		
	}
};
int main(int atgc, char * argv[]) 
{
	CList<CNode> nodelist;		//構造一個類模板例項
	for (int n = 0; n < 5; n++) //利用迴圈向連結串列中新增節點
	{
		CNode *pNode = new CNode();   //建立節點物件
		pNode->m_Data = n;		//設定節點資料
		nodelist.AddNode(pNode);  //向連結串列中新增節點
	}
	nodelist.PassList();   //遍歷連結串列
	cout << endl;
	CList<CNet> netlist;   //構造一個類模板例項
	for (int i = 0; i < 5; i++)   //利用迴圈向連結串列中新增節點
	{
		CNet *pNode = new CNet();  //建立節點物件
		pNode->m_Data = 97 + i;	   //設定節點資料
		netlist.AddNode(pNode);	   //向連結串列中新增節點
	}

	netlist.PassList();   //遍歷連結串列
	cout << endl;
	cin.get();
	return 0;
}