C++ 資料結構與演算法(四)線性表之迴圈鏈表

來源:互聯網
上載者:User

上一篇寫了 雙向鏈表,今天複習了迴圈鏈表,就寫了個帶有頭結點的迴圈鏈表。具體實現如下:

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

測試:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.