約瑟夫環算法?
約瑟夫環指的是,n個人按編號順序圍成一個環,設置一個數字m,其中m<n(一般m取0-9之間的數);并從環中的第一個人開始,按順時針數數,每數了m個位置,排在m號的位置上的人出列,然后從出列的位置的下一個位置上的人開始數,一直到環中剩下最后一個人為止。
算法步驟:
(1)確定存儲結構:由于是一個環,所以建立一個循環鏈表
(2)設置指針個數:設置一個頭指針*front永遠指向第一個結點(按數字順序的話是指向環中最小的那個節點也可又從0開始數),再設置一個尾指針*prior用于指向報數的人的位置,每報一次數,尾指針指向下一個節點,數到m號時,則刪除該節點,并將尾指針指向下一個節點,一直循環下去。
定義節點類型:
typedef struct Node
{
int data;
struct Node *next;
struct Node *front;
struct Node *prior;
}Node,*LinkList;
(3)向鏈表插入n個人(采用尾插法):
LinkList Create_cirlce()
{
LinkList L,r,p;
L = (Node *) malloc ( sizEOF (Node)); //初始化鏈表
L->next = L;
r = L; //r始終指向最后一個結點
int n;
while ( scanf ( "%d" ,&n) != EOF)
{
p = (Node *) malloc ( sizeof (Node));
p->data = n;
p->next = r->next;
r->next = p;
r = p;
}
r->next = L;
return L;
}
(4)根據指針判斷鏈表是否已出列到最后一個:判斷*prior->next!=L
(5)利用循環遍歷出出列的人:此時需利用兩個循環,外循環代表遍歷到最后一個所需要的循環次數,內循環代表遍歷出列的人
void Josephus(int n,int m){
for(int i=0;i<n-1;i++){
for(int j=0;i<m-1;j++){
Next();//遍歷出出列的人
cout<<"出列的人是:"<<current;//顯示出當前出列的人的位置