C 不帶頭結點的單迴圈鍊錶解決約瑟夫環問題

2021-06-21 04:06:25 字數 3345 閱讀 1146

重新把殷人昆的c++資料結構(2版)重新走一遍,發現以前的基礎太差,這個簡單的基礎的東西都搞了好久才搞出來啊~~~~~

言歸正題:

首先建立要力乙個circlist.h標頭檔案**如下:

//不帶頭結點的單迴圈鍊錶

#ifndef circlist_h

#define circlist_h

#ifndef ch_h

#define ch_h

#include #includeusing namespace std;

#endif

templatestruct circlinknode

circlinknode(t d, circlinknode* next = null) :data(d), link(next)

};templateclass circlist

/*bool isfull()*/

circlinknode*gethead()

bool insert(int i, t& x);

bool remove(int i, t& x);

bool setdata(int i, t& x);

bool getdata(int i, t& x);

circlinknode* search(t x);

circlinknode* locate(int i);

void output();

void inputfront(t endtag);

void inputrear(t endtag);

private:

circlinknode*first, *last;

};//

templatecirclist::circlist()

templatecirclist::circlist(const t& x)

templatecirclist::circlist(circlist& l)

last = destptr;

last->link = first;

}templatecirclist::~circlist()

templateint circlist::length()const

return ++count;

}templatevoid circlist::makeempty()

last = null;

}templatebool circlist::insert(int i, t& x)

circlinknode*current = locate(i);

if (current==null)

circlinknode*newnode = new circlinknode(x);

if (newnode==null)

if (current!=last)

else

}templatebool circlist::remove(int i, t& x)

else if (current == first)

else if (current==last)

else

return true;

}templatebool circlist::setdata(int i, t& x)

circlinknode*current = locate(i);

if (!current)

current->data = x;

return true;

}templatebool circlist::getdata(int i,t& x)

circlinknode*current = locate(i);

if (!current)

x = current->data;

return true;

}template//circlinknode* circlist::search(t x)const

circlinknode* circlist::search(t x)

else

}return current;

}templatecirclinknode* circlist::locate(int i)

if (i == 0)

circlinknode* current = first;

int k = 1;

while (current->link != first && k < i)

return current;

}templatevoid circlist::inputfront(t endtag)

last = first = newnode;

first->link = last;

last->link = first;

while (val != endtag)

else}}

}templatevoid circlist::inputrear(t endtag)

else}}

}templatevoid circlist::output()

cout << "#" << i << ":" << current->data << endl;

}#endif

之後就是測試自己的寫的**和寫出約瑟夫環的結果了:

main.cpp如下:

#include "circlist.h"

templatevoid josephus(circlist& js, int n, int m)

cout << "出列的第"

pre->link = p->link;

delete p;

p = pre->link;

}cout << "最後的幸運者:" << p->data << endl;

}

main.cpp**如下:

void main()

*///cout << "前插法:" << endl;

///*cout << "insert函式插入乙個數:"

int i, n, m;

cout << "建立迴圈鍊錶:" << endl;

clist.inputrear(-1);

cout << "輸入遊戲的人數和報數間隔:";

cin >> n >> m;

josephus(clist, n, m);

while (1)

}

注意:血淚史,如果**是模板類的話,不要把宣告和定義分開放在標頭檔案和原始檔中,不然會有好多你意想不到的錯誤啊!!!!

截圖效果如下:

不帶頭結點的單迴圈鍊錶

建立標頭檔案nlist.h pragma once 不帶頭節點的鍊錶,主要應用在迴圈鍊錶中,其缺點,操作複雜 會出現二級指標 優點 靈活 頭指標指向哪個節點哪個節點就是第乙個節點 不帶頭節點的單鏈迴圈鍊錶,尾節點的next指向第乙個節點 typedef struct nnode nnode,pnli...

約瑟夫環問題(不帶頭結點單迴圈鍊錶實現和陣列實現)

q 略 a 為了簡化過程,類中只有3個函式即可,構造,增加,約瑟夫環解決函式 ps 做這道題是為了鞏固鍊錶知識,在這過程中,this指標很隱蔽,code include using namespace std template struct linknode linknode t item,link...

不帶頭結點的雙向迴圈鍊錶

基本概念 迴圈鍊錶 將單鏈表中最後乙個結點的next指向頭結點或者空指標,就使得整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。雙向鍊錶 是在單鏈表的每個結點中,再設定乙個指向其前驅結點的指標域prior,在雙向鍊錶的結點中有兩個指標域,乙個next指向直接後繼,乙個prio...