資料結構基礎 11 迴圈鍊錶的設計與實現

2021-07-04 09:18:16 字數 2992 閱讀 4889

迴圈鍊錶:最後乙個結點的指標域的指標又指回第乙個結點的鍊錶;

迴圈單鏈表與單鏈表的區別在於:表中最有乙個節點的指標不再是null, 而改為指向頭結點(因此要對我們原來的mylist稍作修改), 從而整個鍊錶形成乙個環.

因此, 迴圈單鏈表的判空條件不再是頭結點的指標是否為空, 而是他是否等於頭結點;

下面是mylist.h的完整**與解析, 由於**較多, 希望能夠仔細閱讀, 但其實下面的大部分**都與前面類似只是對其中幾處稍作修改, 遇到與單鏈表的不同之處, 我會與++符號作為注釋指出:

[cpp]view plain

copy

#ifndef mylist_h_included

#define mylist_h_included

#include 

#include 

using

namespace std;  

//迴圈鍊錶

//前向宣告

template

class mylist;  

template

class listiterator;  

//鍊錶節點

template

class node  

type data;  //資料域:節點資料

node *next; //指標域:下乙個節點

};  

//鍊錶

template

class mylist  

;  template

mylist::mylist()  

template

mylist::~mylist()  

// ++ 釋放到鍊錶的空節點

delete tmp;  

}  //這一步與前一版鍊錶相同

template

void mylist::insertfront(const type &data)  

template

void mylist::insert(const type &data, int index)  

// 插入鍊錶

node*newnode = new node(data);  

newnode->next = searchnode->next;  

searchnode->next = newnode;  

}  template

void mylist::remove(const type &data)  

previous = searchnode;  

}  }  

//注意判空條件

template

bool mylist::isempty() const

//顯示鍊錶中的所有資料(測試用)

template

ostream &operator<

return os;  

}  //listiterator 除了判空函式的判空條件之外, 沒有任何改變

template

class listiterator  

//過載 *operator

const type &operator*() const

throw (std::out_of_range);  

type &operator*() throw (std::out_of_range);  

//過載 ->operator

const node*operator->() const

throw (std::out_of_range);  

node*operator->() throw (std::out_of_range);  

//過載 ++operator

listiterator &operator++() throw (std::out_of_range);  

//注意:此處返回的是值,而不是reference

listiterator operator++(int) throw (std::out_of_range);  

bool isempty() const;  

private:  

const mylist&list;  

node*currentnode;  

};  

template

bool listiterator::isempty() const

template

const type &listiterator::operator*() const

throw (std::out_of_range)  

template

type &listiterator::operator*()  

throw (std::out_of_range)  

template

const node*listiterator::operator->() const

throw (std::out_of_range)  

template

node*listiterator::operator->()  

throw (std::out_of_range)  

template

listiterator&listiterator::operator++()  

throw (std::out_of_range)  

template

listiteratorlistiterator::operator++(int)  

throw (std::out_of_range)  

#endif // mylist_h_included

附-測試**:

[cpp]view plain

copy

int main()   

資料結構基礎 11 迴圈鍊錶的設計與實現

迴圈鍊錶 最後乙個結點的指標域的指標又指回第乙個結點的鍊錶 迴圈單鏈表與單鏈表的區別在於 表中最有乙個節點的指標不再是null,而改為指向頭結點 因此要對我們原來的mylist稍作修改 從而整個鍊錶形成乙個環.因此,迴圈單鏈表的判空條件不再是頭結點的指標是否為空,而是他是否等於頭結點 下面是myli...

資料結構基礎 之 迴圈鍊錶

迴圈鍊錶是一種首尾相接的鍊錶。1 單迴圈鍊錶 在單鏈表中,將終端結點的指標域null改為指向表頭結點或開始結點即可。2 多重鏈的迴圈鍊錶 將表中結點鏈在多個環上。帶頭結點的單迴圈鍊錶 非空表 空表判斷空鍊錶的條件是head head next 僅設尾指標的單迴圈鍊錶 用尾指標rear表示的單迴圈鍊錶...

資料結構 迴圈鍊錶

近期我在學習資料結構,於是我自己整理了單鏈表 迴圈單鏈表 雙向鍊錶 雙向迴圈鍊錶的相關 以鞏固這段時間的學習,也希望能夠幫助初學者,希望大家在閱讀以下 時發現問題糾正於我,一起 cyclinklist.h ifndef cyclinklist h define cyclinklist h inclu...