錯誤: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...