约瑟夫问题如下:已知n个人(n>=1)围坐一圆桌周围,从1开始顺序编号。从序号为1的人开始报数,顺时针数到m的那个人出列。他的下一个人又从1开始报数,数到m的那个人又出列。依此规则重复下去,直到所有人全部出列。请问最后一个出列的人的编号。
//C Version One-way circular linked list(单向循环链表)
#include <stdio.h>
#include <stdlib.h>
typedef struct Circular_List
{
int data;
struct Cirular_List *next;
}CList;
CList* init_CList(int *num)
{
int i;
printf("Please input the number of nodes:");
scanf("%d",num);
//Circle_Queue *q=(Circle_Queue*)malloc(num*sizeof(Circle_Queue));
CList *p=(CList*)malloc(sizeof(CList));
CList *head=p;
for(i=1;i<*num;++i)
{
//q->data=(i+1);
p->data=i;
p->next=(CList*)malloc(sizeof(CList));
p=p->next;
}
p->data=*num;
p->next=head;
return head;
}
int del_CList(CList *p, int N)
{
int m;
int i,j;
printf("Please input the m you want to delete:");
scanf("%d",&m);
//while(p!=null)
for(i=1;i<N;++i)
{
for(j=1;j<(m-1);++j)
p=p->next;
CList *q=p->next;
p->next=q->next;
printf("The dequeued one is number %d\n",q->data);
free(q);
//q->next=NULL;
//p->next=p->next->next;
//free(p->next);
p=p->next;
}
return p->data;
}
int main()
{
int total, last;
CList *list;
list=init_CList(&total);
last=del_CList(list,total);
printf("The last one dequeued is %d",last);
return 0;
}
