迴圈鍊錶和約瑟夫環

2021-07-02 18:01:29 字數 2798 閱讀 2597

迴圈鍊錶時另一種形式的鏈式儲存結構,把單鏈表中指向最後乙個結點的指標指向單鏈表的表頭結點,就形成了乙個迴圈鍊錶。迴圈鍊錶無論從鍊錶中的任意出發點出發均可找到表中的其他結點。

約瑟夫問題是猶太歷史學家約瑟夫的乙個故事:在羅馬人占領喬塔帕特後,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 ...