迴圈鍊錶時另一種形式的鏈式儲存結構,把單鏈表中指向最後乙個結點的指標指向單鏈表的表頭結點,就形成了乙個迴圈鍊錶。迴圈鍊錶無論從鍊錶中的任意出發點出發均可找到表中的其他結點。
約瑟夫問題是猶太歷史學家約瑟夫的乙個故事:在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從。首先從乙個人開始,越過k-2個人(因為第乙個人已經被越過),並殺掉第
k個人。接著,再越過k-1個人,並殺掉第
k個人。這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什麼地方才能避免被處決?josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。
用迴圈鍊錶來實現約瑟夫問題是乙個很好的選擇,第一,鍊錶插入和刪除元素的操作非常簡單,第二,迴圈鍊錶時乙個環,可以持續進行計數殺人。然後我就花了一整天的時間來搞迴圈鍊錶和約瑟夫問題。
標頭檔案:(cirlinklist.h)
//cirlinklist迴圈鍊錶
#ifndef cirlinklist_h_
#define cirlinklist_h_
#include using std::cout;
using std::endl;
templatestruct node
;template node::node()
templatenode::node(t item, node*link=null)
template class ******cirlinklist
;//初始化
templatevoid ******cirlinklist::init()
templatenode*******cirlinklist::getelemptr(int position) const
while(tempptr->next!=head && curpositionnext;
++curposition;
} if(tempptr!=head && curposition==position)
else }
//建構函式
template******cirlinklist::******cirlinklist()
template ******cirlinklist::~******cirlinklist()
//析構函式
template int ******cirlinklist::length() const
return count;
}template bool ******cirlinklist::isempty()
else }
template void ******cirlinklist::clear()
}template void ******cirlinklist::getelem(int position, t &e)
}template ******cirlinklist&******cirlinklist::setelem(int position, const t e)
return *this;
}template ******cirlinklist&******cirlinklist::deleteelem(int position, t &e)
return *this;
}template******cirlinklist&******cirlinklist::deletenode(node*tempptr)
newptr->next=tempptr->next;
delete tempptr;
return *this;
}template ******cirlinklist&******cirlinklist::insertelem(int position, const t e)
return *this;
}template ******cirlinklist::******cirlinklist(const ******cirlinklist©)
}template ******cirlinklist&******cirlinklist::operator =(const ******cirlinklist©)
} return *this;
}template std::ostream &operator <<(std::ostream &os, ******cirlinklist&cirlinklist)
cout<<"約瑟夫鍊錶為:"<*deadmanptr;
node*tempptr=cirlink.getelemptr(1);
int e,s;
cout<<"殺人順序為:";
for(int i=1; i<=n; i++)
tempptr=tempptr->next;
if(tempptr==cirlink.getelemptr(0))
}e=tempptr->data;
coutcirlink.deletenode(tempptr);
tempptr=deadmanptr;
/*cirlink.deleteelem(e,s);*/
} coutcout<<"鍊錶的長度為:"******cirlinklistcopy=cirlinklist;
copy.insertelem(2,0).insertelem(3,0);
cout<<"鍊錶的長度為:"<
迴圈鍊錶(約瑟夫環)
約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。要通過輸入n,m,k三個正整數,來求出列的序列。這個問題採用的是典型的...
拉丁方陣和約瑟夫環 鍊錶 python
coding utf 8 software 演算法學習 datetime 2020 4 9 9 14 上午 class node object 鍊錶的節點物件 包含資料與和指標域 def init self,data none next none self.value data self.next ...
迴圈鍊錶應用 約瑟夫環
約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。include includetypedef struct node ...