前面兩篇是關於順序表和單鏈表的,下面這個是雙向鏈表,具體實現代碼如下:
結點類檔案(ListNode.h):
template<typename T> class DoubleList;template<typename T>class ListNode{private: ListNode():m_pprior(NULL),m_pnext(NULL) { } ListNode(const T item,ListNode<T>* pprior = NULL,ListNode<T>* pnext = NULL) { m_data = item; m_pprior = pprior; m_pnext = pnext; } ~ListNode() { m_pprior = NULL; m_pnext = NULL; } friend class DoubleList<T>;private: T m_data;//資料項目 ListNode* m_pprior;//直接前驅指標 ListNode* m_pnext;//直接後繼指標};
雙向鏈表類(DoubleList.h):
#include "ListNode.h"template<typename T>class DoubleList{public: DoubleList() {//使head指向它自己 head = new ListNode<T>(); head->m_pprior = head; head->m_pnext = head; } ~DoubleList() { EmptyList(); delete head; }public: void EmptyList();//清空鏈表 int Length() const;//鏈表長度 ListNode<T>* Find(T item);//尋找與item相等的資料項目 bool Insert(const T item,int n =0);//插入item到第n個資料項目,即第n+1個開始都往後移 void Delete(int n);//刪除第n個資料結點 T GetData(int n) const;//獲得第n個資料結點 void Print();//遍曆輸出鏈表所有結點資料private: ListNode<T>* head;};template<typename T>void DoubleList<T>::EmptyList(){//清空鏈表 ListNode<T>* p = head->m_pnext; ListNode<T>* pdel; while(p!=head) { pdel = p; p = pdel->m_pnext; delete pdel; } p->m_pprior = head; p->m_pnext = head;}template<typename T>int DoubleList<T>::Length() const{//擷取鏈表長度 int count = 0; ListNode<T>* p = head->m_pnext; while(p!= head) { count ++; p = p->m_pnext; } return count;}template<typename T>ListNode<T>* DoubleList<T>::Find(T item){//雙向尋找 ListNode<T>* pprior = head->m_pprior; ListNode<T>* pnext = head->m_pnext; while(pprior->m_pnext != pnext && pprior != pnext) { if(pprior->m_data == item) return pprior; if(pnext->m_data == item) return pnext; pprior = pprior->m_pprior; pnext = pnext->m_pnext; } return NULL;//沒有找到 }template<typename T>bool DoubleList<T>::Insert(const T item,int n){//插入資料元素 if(n < 0) return false; ListNode<T>* pnewnode = new ListNode<T>(item); ListNode<T>* p = head; for(int i =0 ;i< n;i ++) {//讓p指向要插入結點位置 p = p->m_pnext; if(p == head) return false; } //插入結點 pnewnode->m_pnext = p->m_pnext; pnewnode->m_pprior = p; p->m_pnext = pnewnode; p->m_pnext->m_pprior = pnewnode; return true;}template<typename T>void DoubleList<T>::Delete(int n){ if(n < 0) return; ListNode<T>* p = head; ListNode<T>* pdel; for(int i =0; i< n ;i++) {//找到第n個位置 p = p->m_pnext; if(p == head) { return; } } //刪除結點 pdel = p; p->m_pprior->m_pnext = p->m_pnext; p->m_pnext->m_pprior = p->m_pprior; delete pdel;}template<typename T>T DoubleList<T>::GetData(int n) const{ if(n < 0) return NULL; ListNode<T>* p = head; for(int i =0; i< n ;i++) {//找到第n個位置 p = p->m_pnext; if(p == head) { return NULL; } } T data = p->m_data; return data;}template<typename T>void DoubleList<T>::Print(){ ListNode<T>* p = head->m_pnext;//p指向第一個結點 cout << "head" ; while(p != head) { cout << "-->" << p->m_data ; p = p->m_pnext; } cout <<"-->over" << endl ;}
測試類別(Doublelist.cpp):
// Doublelist.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include "DoubleList.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ DoubleList<int> doublelist; for(int i=0;i<10;i++){ doublelist.Insert(i*3,i); } int data = doublelist.GetData(3); doublelist.Print(); cout << doublelist.Length() << endl; cout << data <<endl; doublelist.Insert(88888,5); doublelist.Print(); cin.get(); return 0;}
測試: