約瑟夫問題實驗 迴圈單鏈表

2021-10-04 14:52:16 字數 1432 閱讀 8159

一、實驗目的和要求

(一)問題描述

設有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...