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

2021-07-09 17:16:28 字數 4110 閱讀 8094

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

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

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

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

[cpp]view plain

copy

#ifndef mylist_h_included

#define mylist_h_included

#include 

#include 

using

namespace

std;  

//迴圈鍊錶

//前向宣告

template

<

typename

type>  

class

mylist;  

template

<

typename

type>  

class

listiterator;  

//鍊錶節點

template

<

typename

type>  

class

node  

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

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

};  

//鍊錶

template

<

typename

type>  

class

mylist  

;  template

<

typename

type>  

mylist::mylist()  

template

<

typename

type>  

mylist::~mylist()  

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

delete

tmp;  

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

template

<

typename

type>  

void

mylist::insertfront(

const

type &data)  

template

<

typename

type>  

void

mylist::insert(

const

type &data, 

intindex)  

// 插入鍊錶

node*newnode = new

node(data);  

newnode->next = searchnode->next;  

searchnode->next = newnode;  

}  template

<

typename

type>  

void

mylist::remove(

const

type &data)  

previous = searchnode;  

}  }  

//注意判空條件

template

<

typename

type>  

bool

mylist::isempty() 

const

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

template

<

typename

type>  

ostream &operator<

mylist&list)  

return

os;  

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

template

<

typename

type>  

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

<

typename

type>  

bool

listiterator::isempty() 

const

template

<

typename

type>  

const

type &listiterator::operator*() 

const

throw

(std::out_of_range)  

template

<

typename

type>  

type &listiterator::operator*()  

throw

(std::out_of_range)  

template

<

typename

type>  

const

node*listiterator::operator->() 

const

throw

(std::out_of_range)  

template

<

typename

type>  

node*listiterator::operator->()  

throw

(std::out_of_range)  

template

<

typename

type>  

listiterator&listiterator::operator++()  

throw

(std::out_of_range)  

template

<

typename

type>  

listiteratorlistiterator::operator++(int

)  throw

(std::out_of_range)  

#endif // mylist_h_included

附-測試**:

[cpp]view plain

copy

intmain()  

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

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

資料結構基礎 之 迴圈鍊錶

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

資料結構 迴圈鍊錶

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