C++ 資料結構與演算法(三)線性表之雙向鏈表

來源:互聯網
上載者:User

前面兩篇是關於順序表和單鏈表的,下面這個是雙向鏈表,具體實現代碼如下:

結點類檔案(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;}

 

測試:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.