偷懶很久不發資料結構了,其實**都寫好了,但是書上的應用遲遲吃不透搞不定,所以也就沒有及時發出來。
我看的是《資料結構、演算法與應用 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的人出列,本程式結果為人員出列順序...