連結串列類模板
阿新 • • 發佈:2019-02-08
#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; }