資料結構 C語言 約瑟夫問題
阿新 • • 發佈:2019-02-06
一、問題描述:約瑟夫問題
一個旅行社要從n個旅客中選出一名旅客,為他提供免費的環球旅行服務。旅行社安排這些旅客圍成一個圓圈,從帽子中取出一張紙條,用上面寫的正整數m作為報數值。遊戲進行時,從第s個人開始按順時針方向自1開始順序報數,報到m時停止報數,報m的人被淘汰出列,然後從他順時針方向上的下一個人開始重新報數,如此下去,直到圓圈中只剩下一個人,這個最後的倖存者就是遊戲的勝利者,將得到免費旅行的獎勵。其中資料結構採用單迴圈連結串列。
二、任務要求
用單迴圈連結串列解決約瑟夫問題。
三、測試資料
輸入說明,輸入的第一行表示總的旅客數,輸入的第二行表示報數值,輸入的第三行表示報數人的起始編號。
輸入樣例:
9
5
1
輸出說明,輸出這n個人的淘汰順序
輸出樣例:
5
1
7
4
3
6
9
2
8
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int num;
struct node *next;
}linkList;
int count = 0;
int create(linkList *head, int n)
{
int i;
int index = 2;
linkList *p, *s;
p = head;
for (i = 1; i < n; i++) {
s = (linkList*)malloc(sizeof(linkList));
s ->num = index;
s->next = p->next;
p->next = s;
p = s;
index++;
count++;
}
return 0;
}
int func(linkList *head, int startNum, int circData)
{
linkList *p;
int i;
p = head;
for (i = 1; i < startNum; i++) {
p = p->next ;
}
while (count >= 1) {
for (i = 0; i < circData - 2; i++) {
p = p->next;
}
printf("%d\n", p->next->num);
p->next = p->next->next;
p = p->next;
count--;
}
return 0;
}
int main()
{
linkList *head, *p;
int i, n, circData, startNum;
head = (linkList*)malloc(sizeof(linkList));
head->next = head;
count++;
head->num = 1;
scanf("%d", &n);
create(head, n);
p = head;
scanf("%d", &circData);
scanf("%d", &startNum);
func(head, startNum, circData);
system("pause");
return 0;
}