上一篇寫了 雙向鏈表,今天複習了迴圈鏈表,就寫了個帶有頭結點的迴圈鏈表。具體實現如下:
結點類檔案(ListNode.h):
template<typename T> class CircularList;template<typename T>class ListNode{public: friend class CircularList<T>; ListNode():m_pnext(NULL) { } ListNode(const T data, ListNode<T>* pnext = NULL):m_data(data),m_pnext(pnext) { } ~ListNode() { m_pnext = NULL; }private: T m_data; ListNode<T>* m_pnext;};
迴圈鏈表類檔案(CircularList.h):
#include "ListNode.h"template<typename T>class CircularList{public: CircularList():head(new ListNode<T>()) { head->m_pnext = head; } ~CircularList() { EmptyList(); delete head; }public: void EmptyList();//清空鏈表 int Length();//計算鏈表長度 bool Insert(T item, int n = 0);//插入元素 ListNode<T>* Find(int n);//尋找第n個元素 T Delete(int n);//刪除第n個元素 T GetData(int n);//擷取第n個元素項 void Print();//輸出鏈表private: ListNode<T>* head;};template<typename T>void CircularList<T>::EmptyList(){//清空鏈表 ListNode<T>* p = head, *pdel; while (p->m_pnext != head) { pdel = p->m_pnext; p->m_pnext = pdel->m_pnext; delete pdel; }}template<typename T>int CircularList<T>::Length(){//計算鏈表長度 int count = 0; ListNode<T>* p = head; while (p->m_pnext != head) { count ++ ; p = p->m_pnext; } return count;}template<typename T>bool CircularList<T>::Insert(T item, int n = 0){//插入元素 if(n < 0 || n > Length()) return false;//n出界 ListNode<T>* p = head; ListNode<T>* pnewnode = new ListNode<T>(item); if(pnewnode == NULL) return false; for(int i = 0 ;i< n;i ++) { p = p->m_pnext; if(p == head) return false;//n出界 } pnewnode->m_pnext = p->m_pnext; p->m_pnext = pnewnode; return true;}template<typename T>ListNode<T>* CircularList<T>::Find(int n){//尋找第n個元素 if(n < 0 || n > Length()) return false; ListNode<T>* p = head; while(p != head) { p = p->m_pnext; } if(p == head) return NULL; return p;}template<typename T>T CircularList<T>::Delete(int n){//刪除第n個元素 if(n < 0 || n > Length()) return NULL; ListNode<T>* p = head,*pdel; for(int i =0 ;i < n; i ++) { p = p->m_pnext; } pdel = p->m_pnext; p->m_pnext = pdel->m_pnext; T data = pdel->m_data; delete pdel; return data;}template<typename T>T CircularList<T>::GetData(int n){//擷取第n個元素項 if(n < 0 || n > Length()) return NULL; ListNode<T>* p = head; for(int i = 0; i< n ;i ++) { p = p->m_pnext; } return p;}template<typename T>void CircularList<T>::Print(){ ListNode<T>* p = head; cout << "head" ; while(p->m_pnext != head) { p = p->m_pnext; cout << "-->" << p->m_data; } cout << "-->" << endl;}
測試類別檔案(Circularlist.h):
// Circularlist.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include "CircularList.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ CircularList<int> circularlist; for(int i = 0; i< 15; i ++) circularlist.Insert(i * 3,i); circularlist.Print(); cout << "the length of list is: " << circularlist.Length() << endl; int del = circularlist.Delete(3); cout << del <<"is deleted " << endl; circularlist.Print(); cout << "the length of list is: " << circularlist.Length() << endl; cin.get(); return 0;}
測試: