迴圈鍊錶:最後乙個結點的指標域的指標又指回第乙個結點的鍊錶;
迴圈單鏈表與單鏈表的區別在於:表中最有乙個節點的指標不再是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...