下面是迴圈鍊錶的乙個c++實現,參考了《資料結構與演算法分析c語言版》及不少牛人的分析總結,在此一併感謝了。在vc2005上經反覆驗證試驗,結果非常不錯。這是乙個比較簡易的實現,讓其繼承自單鏈表,並提供了乙個專為解決約瑟夫問題的函式(removeat)。以後將會開發乙個更一般性的版本。
注意:單鏈表及雙向及迴圈鍊錶均不使用表頭(即啞節點,dummy node), 即m_pnodehead指向鍊錶的第乙個真正的節點。
單鏈錶類slist的實現見本部落格的文章《單鏈表的乙個c++實現》。
/*clist.h*/
#include "slist.h"
/*一般而言,將迴圈鍊錶繼承自單向鍊錶,會有一些問題的:
1.作為基類的單向鍊錶的析構函式應該為虛函式,因為作為有多型性質的基類的析構函式必須是virtual的;
2.迴圈列表中重定義了函式removeat,一般情況下絕對不應該重定義基類中的非虛函式的,因為會導致精神**症:通過指向或應用迴圈列表
的基類指標或引用來呼叫該函式時,會呼叫基類中removeat,而通過迴圈列表本身或指向或引用它的派生類指標或引用呼叫該函式時,會呼叫
派生類中的removeat。
但是,如果不適用多型性質,也就是不通過基類的指標或引用來操縱派生類物件的情況下,上述兩個問題是不會爆發出來的!*/
templateclass clist : public slist;
templateinline clist::clist() : m_pnodecurr(null)
/*這個函式很重要。迴圈鍊錶是概念上的,實際上鍊表的最後乙個節點並未指向其頭節點。迴圈鍊錶的概念是靠該函式來實施的。
如果當前節點為null或者當前節點為最後乙個節點,則將其調整為指向頭節點,否則將其向後移動乙個節點;
然後返回當前節點的資料。*/
templateinline t& clist::getnext()
//返回當前節點的位置。
templateinline int clist::getcurrentindex() const
return 0;
}//刪除乙個節點,就讓當前節點指向其前乙個節點;如果刪除的是頭節點,則應將當前節點置為null。
//這個函式似乎專為解決約瑟夫問題而設計的。
templateinline void clist::removeat(const int pos)
for (i = 1; i < pos; ++i)
ptmpnode2->next = ptmpnode1->next;
// added for loop list
m_pnodecurr = ptmpnode2;
delete ptmpnode1;
--m_ncount;
return;
}
c 語言 乙個鍊錶的實現
include include typedef int elementtype typedef int bool define true 1 define false 0 inline bool compare int a,int b,bool flag typedef struct lnode l...
C 實現迴圈鍊錶
vs2005執行通過,如有問題,請各位大牛指正。謝謝 注意 迴圈鍊錶含有頭結點 include using namespace std templatestruct node templateclass circlist templatecirclist circlist 初始化時,只有乙個頭結點,...
迴圈鍊錶 C實現
沒有頭結點 define crt secure no warnings include include typedef struct list list void creat list list p 如果鍊錶為空,則建立乙個鍊錶,指標域指向自己,否則尋找尾節點,將 else 輸入的鍊錶不是空的,尋找...