迴圈鏈表示例 求解約瑟夫問題

2021-08-08 21:38:58 字數 3736 閱讀 1326

錯誤:debug assertion failed!

//迴圈鍊錶模板class

#include

using

namespace

std;

template

struct circlelinknode

circlelinknode(t d, circlelinknode* next = null) : data(d), link(next) {}

};template

class circlelist

circlelinknode* gethead() const; //返回附加頭節點的位址

void sethead(circlelinknode* p); //設定附加頭節點的位址

circlelinknode* search(t x); //搜尋含資料x的節點

circlelinknode* locate(int i); //搜尋第i個元素的位址

t getdata(int i); //取出第i個元素的值

void setdata(int i, t & x); //用修改第i個元素的值

bool insert(int i, t & x); //在第i個元素後插入x

bool remove(int i, t & x); //刪除第i個元素,用x儲存刪除的資料

void createlist(t endflag); //建立單鏈表

void outputlist(int stopsequence);

protected:

circlelinknode*first, *last; //頭指標、尾指標

};//函式定義

template

circlelist::circlelist(const t & x)

template

circlelist::~circlelist()

delete first;

}template

circlelinknode* circlelist::gethead() const

template

int circlelist::length() const

return len;

}template

circlelist::circlelist(circlelist&l)

last = create; //標記尾節點

for (int i = 0; i < len - 1; i ++)

}//將l中的data域逐一copy到當前鍊錶中

copydata = first->link;

srcdata = l.first->link;

while (srcdata == l.first)

//構建迴圈鍊錶

last->link = first;

}template

circlelinknode* circlelist::search(t x)

current = current->link;

}return current;

}template

circlelinknode* circlelist::locate(int i)

circlelinknode* current = null;

current = first;

for (int j = 0; j < i; j ++)

return current;

}template

void circlelist::createlist(t endflag)

last = create; //標記尾節點

while (inputdata != endflag)

}//單鏈表建立完成

last->link = first; //構建迴圈鍊錶

}template

t circlelist::getdata(int i)

template

void circlelist::setdata(int i, t & x)

template

bool circlelist::insert(int i, t & x)

if (0 == i)

else

//更新last指向的節點

last = locate(length());

return

true;

}template

bool circlelist::remove(int i, t & x)

template

void circlelist::outputlist(int stopsequence)

//輸出迴圈鍊錶,直到指定序號停止輸出(方便測試迴圈特性)

circlelinknode* current = null;

current = first->link;

for (int i = 0; i < stopsequence; i ++)

}cout

<< endl;

}

主函式及約瑟夫處理函式測試

//迴圈鍊錶例項,求解約瑟夫問題

#include

#include "circlelist.cpp"

using

namespace

std;

template

void josephus(circlelist& js, int n, int m);

int main()

josephus(circle, nodesamount, delsequence); //解決約瑟夫問題

system("pause");

return

0;}

template

void josephus(circlelist& js, int n, int m)

//開始刪除報數後的節點

prenode = currnode;

currnode = currnode->link;

if(currnode == js.gethead())

}cout

<< "刪除的資料是 : "

<< currnode->data << endl;

prenode->link = currnode->link;

delete currnode;

currnode = prenode->link; //這步毋漏}}

正常執行結果顯示:

資料結構需要大量的時間實踐與研究,希望我們能夠多花點時間練習,珍惜當前的時間,做任何一件事都應該有目標!

使用單鏈表求解約瑟夫環問題

約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。單鏈表參考 約瑟夫環運作如下 1 一群人圍在一起坐成環狀...

用迴圈佇列求解約瑟夫環問題

用迴圈佇列求解約瑟夫環問題普通形式求解 對比分析 設有n個人站成一圈,其編號為1 n。從編號為1的人開始按順時針方向1 2 迴圈報數,數到m的人出列,然後從出列者的下乙個人重新開始報數,數到m的人又出列,如此重複進行,直到n個人都出列為止。要求輸出這n個人的出列順序。例子展示 當n 5,m 2時的約...

利用迴圈鍊錶求解約瑟夫問題

這題其實就是約瑟夫問題換了個 皮。用迴圈鍊錶解決的話思路最清晰,如下,注意看注釋的解釋。using system.collections.generic class circlenode 建立迴圈鍊錶節點 class solution temp.next head 迴圈結束,所有節點已經插入,則讓t...