//数据结构 C语言版(清华大学_唐国民_第3版)
//循环链表,书 P36 例子2.5.1 约瑟夫问题,与书上代码方法不同,不用在意,重要的是思路
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode* List;
typedef int ELementType;
struct LNode {
ELementType Data;
List Next;
};
int main()
{
int n, s, m,i,j;
List Prtl,Tail,p,q;
Prtl = (List)malloc(sizeof(struct LNode));
Prtl->Next = NULL;
Tail = Prtl;
printf("总人数为?\n");
scanf("%d", &n);
printf("从第几个人开始报数?\n");
scanf("%d", &s);
printf("数到数字几的人出列?\n");
scanf("%d", &m);
printf("输出如下:\n");
if (n <= 0 || s <= 0 || m <= 0 || n < s) {
printf("不合法!\n");
return 0;
}
for(i=0;i<n;++i){
p=(List)malloc(sizeof(struct LNode));
p->Data=i+1;
Tail->Next=p;
p->Next=Prtl->Next;
Tail=p;
}
q=Prtl->Next;
for(i=1;i<s-1;++i){
q=q->Next;
}
p=q->Next;
i=1;
while(n>1){
if(i==m){
printf("%d\n",p->Data);
q->Next=p->Next;
free(p);
p=q->Next;
n--;
i=1;
}else{
p=p->Next;
q=q->Next;
i++;
}
}
printf("%d\n",p->Data);
return 0;
}
04-30
1241