一、實驗目的和要求
(一)問題描述
設有n個人圍坐在圓桌周圍,現從某個位置m(1≤m≤n)上的人開始報數,報數到k的人就站出來。下乙個人,即原來的第k+1個位置上的人,又從1開始報數,再報數到k的人站出來。依次重複下去,直到全部的人都站出來為止。試設計乙個程式求出這n個人的出列順序。
(二)問題分析
這是乙個使用迴圈鍊錶的經典問題。因為要不斷出列,所以採用單鏈表的儲存方式能更恰當的模擬出列的情況,因此採用乙個不帶頭結點的迴圈單鏈表來解決約瑟夫問題。
(三)問題要求
1.構造乙個具有n個結點的迴圈單鏈表,用於儲存圓桌周圍的人的編號,鍊錶結點的data域存放桌子周圍的人的編號。
2.為保持程式的通用性,問題中的n、m、k可由使用者從鍵盤輸入.
3.要求編寫函式模擬約瑟夫問題的實現過程,並輸出n個人的出列順序。
二、實驗內容
(一)源程式
#include #include #include #include #define maxsize 100
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
#define list_init_size 5
#define listincrement 1
using namespace std;
typedef int status;
typedef int elemtype; //表內元素型別為 int, 可更改
typedef struct lnode
lnode, *linklist;
int n, m, k; //全域性變數
void createlist(linklist &l, linklist &r) //建立乙個帶頭結點的單鏈表, 尾插, 記錄頭指標和尾指標
r -> next = l; //首尾相連
}void print(linklist &l, linklist &r)
int num = 1;
if(k != 1) // k 等於 1 是不好控制,單獨判斷
if(pre == p) //前一指標和當前指標相同,意味著只有乙個指標,報號結束
break;
pre = p;}}
else
}printf("\n");
}int main()
printf("約瑟夫問題實驗,進行實驗請按 1 ,退出實驗請按 0:\n");
}return 0;
}
(二)執行結果
迴圈單鏈表實現約瑟夫問題
一堆猴子都有編號,編號是1,2,3 m,這群猴子 m個 按照1 m的順序圍坐一圈,從第1開始數,每數到第n個,該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最後乙隻猴子,則該猴子為大王。本題實現 輸出出佇列的順序的編號1.節點類package yosepfu program 3.鍊錶的相關操作 d...
約瑟夫問題 迴圈單鏈表解法
m prear 是指向單鏈表的尾部的指標。m prear m next 是指向頭指標。函式ysf就是對約瑟夫問題的求解方法函式。includeusing namespace std include stdlib.h define n 13 template class node node typen...
迴圈單鏈表 Joseph約瑟夫環問題
package com.linkedlist author qw date 2020 8 11 22 02 public class josephcircle 迴圈單鏈表 class circlesinglelinkedlist child cur null 輔助指標,幫助構建迴圈鍊錶 for in...