資料結構 C 實現(三)迴圈鍊錶

2021-07-25 19:06:05 字數 4330 閱讀 6817

偷懶很久不發資料結構了,其實**都寫好了,但是書上的應用遲遲吃不透搞不定,所以也就沒有及時發出來。

我看的是《資料結構、演算法與應用 c++語言描述》這本書,配合著網易雲課堂上面的乙個入門級別的資料結構公開課一起學習。老實說,了解乙個資料結構不是很難,但是搞清楚她們的應用場合,與適當的演算法結合起來處理問題真麼難上加難,比如什麼約瑟夫環,漢諾塔,不得不佩服開拓這門學科的科學家們。

好了,廢話說太多了,我們來看這回的資料結構,迴圈鍊錶。迴圈鍊錶的最後乙個元素的next指標指向頭指標,這樣就可以構成乙個迴圈鏈路,值得注意,迴圈鍊錶也可以分成單向迴圈與雙向迴圈。迴圈鍊錶的優勢在於靈活方便並且沒有增加多餘的空間要求。

整體結構和之前並無二致,抽象類linear.h與之前相同,這裡就不貼出。

然後是單向迴圈鍊錶:

//

// created by djf on 2016/12/21 0021.

//#ifndef inc_03_singlelinkedcircularlist_doublelinkedlist_singlelinkedcircularlist_h

#define inc_03_singlelinkedcircularlist_doublelinkedlist_singlelinkedcircularlist_h

#include "linearlist.h"

using namespace std;

template

struct chainnode

chainnode(const t& e)

chainnode(const t& e, chainnode

* n)

};template

class singlelinkedcircularlist: public linearlist

//operator t& operator*() const t* operator&() const iterator& operator++() iterator operator++(int) bool operator==(const iterator rhl) const bool operator!=(const iterator rhl) const protected: chainnode

* node; }; iterator begin() iterator end() public: //construct copy destroy singlelinkedcircularlist(): listsize(0) singlelinkedcircularlist(const singlelinkedcircularlist& ); ~singlelinkedcircularlist(); //adt bool empty() const override; int size() const override ; t& get(int index) const override ; int indexof(const t& theelement) const override ; void erase(int index) override ; void insert(int index,const t& theelement) override ; void output(ostream& out) const override ; //extend void clear() override ; void push_back(const t& theelement) override ; protected: void checkindex(int index) const; chainnode

* headernode; int listsize; }; template

singlelinkedcircularlist

::singlelinkedcircularlist(const singlelinkedcircularlist &s) currnode->next = headernode; listsize = s.listsize; } template

singlelinkedcircularlist

::~singlelinkedcircularlist() } template

bool singlelinkedcircularlist

::empty() const template

int singlelinkedcircularlist

::size() const template

void singlelinkedcircularlist

::checkindex(int index) const } template

t &singlelinkedcircularlist

::get(int index) const return currnode->element; } template

int singlelinkedcircularlist

::indexof(const t &theelement) const return -1; } template

void singlelinkedcircularlist

::erase(int index) template

void singlelinkedcircularlist

::insert(int index, const t &theelement) template

void singlelinkedcircularlist

::output(ostream &out) const } template

void singlelinkedcircularlist

::clear() listsize = 0; } template

void singlelinkedcircularlist

::push_back(const t &theelement) #endif //inc_03_singlelinkedcircularlist_doublelinkedlist_singlelinkedcircularlist_h

雙向:

//

// created by djf on 2016/12/21 0021.

//#ifndef inc_03_singlelinkedcircularlist_doublelinkedlist_doublelinkedlist_h

#define inc_03_singlelinkedcircularlist_doublelinkedlist_doublelinkedlist_h

#include "linearlist.h"

using namespace std;

template

struct doublechainnode

doublechainnode(const t& e)

doublechainnode(const t& e, doublechainnode

* p,doublechainnode

* n) }; template

class doublelinkedlist: public linearlist

; public: //construct copy destroy doublelinkedlist():listsize() doublelinkedlist(const doublelinkedlist& d); ~doublelinkedlist(); //adt bool empty() const override ; int size() const override ; t& get(int index) const override ; int indexof(const t& theelement) const override ; void erase(int index) override ; void insert(int index,const t& theelement) override ; void output(ostream& out) const override ; //extend void clear() override ; void push_back(const t& theelement) override ; protected: void checkindex(int index); int listsize; doublechainnode

* headernode; }; template

void doublelinkedlist::checkindex(int index) #endif //inc_03_singlelinkedcircularlist_doublelinkedlist_doublelinkedlist_h

單雙向的區別在於迭代器的定義上,雙向的迴圈鍊錶,迭代器具有遞增和遞減的操作,而單向迴圈鍊錶則只能遞增,遞減則違法。

資料結構C 迴圈鍊錶

我曾經去一家遊戲公司面試時遇到乙個筆試題,大意就是說有一群人出去旅遊,在河中遇到了大風,然後用轉盤決定誰在留在船上,誰自己跳下去自行解決生存問題。大家圍成乙個圈,啟動轉盤,轉盤指向誰就從睡開始數數,當有人數到13時,誰就跳下去,然後從下乙個人開始從頭數,當再有人數到13時,繼續上乙個迴圈。當時題意沒...

資料結構 迴圈鍊錶 C語言程式實現

這個程式是資料結構中的迴圈鍊錶,題目 設有乙個迴圈鍊錶,其結點值均為正整數,且按絕對值從小到大鏈結。試寫出乙個演算法,將此迴圈鍊錶中的結點按值從小到大鏈結。首先定義標頭檔案 include 輸入輸出等系統函式在這個標頭檔案中 include 標準庫標頭檔案 定義結構體 typedef struct ...

C資料結構迴圈鍊錶實現約瑟夫環

c資料結構迴圈鍊錶實現約瑟夫環 本文 均在turbo c 2.0 的環境下執行通過,並得到正確結果,本程式為用迴圈鍊錶實現約瑟夫環,即有m個人站成乙個圓環,從某人 佇列第乙個 開程式設計客棧始報數,約定從某數開始的第n個人出列,他的下乙個再從一開始報,然再乙個報道n的人出列,本程式結果為人員出列順序...