//约瑟夫环
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int ID;//编号
int password;//密码
struct node *next;//指向下一个节点
}ysfh;
ysfh *write(ysfh *head,int n)//创建循环链表
{
int mima;
ysfh *p,*last;
int i=1;
last=head;
printf("请依次,输入%d密码(正整数):",n);
while(i<=n)
{
scanf("%d",&mima);
p=(ysfh *)malloc(sizeof(ysfh));
p->ID=i;
p->password=mima;
if(head==NULL)
{
head=p;
last = p;
}
else
{ last->next = p; last = p;}
i++;
}
last->next=head;//所有结点创建完毕,把尾指针与头指针相连
return (head);
}
void read(ysfh *head,int n,int m)
{
ysfh *p,*q;
int k,i,h=m;//h的增加是为了处理起始数为1(即m=1)的情况
p=head;
for(i=1;i<=n;i++)
{
for(k=1;k<m;k++)
{
if(k==m-1)
q=p;// 让q指向p的上一个节点
p=p->next;
}
while(h==1)
{
q=head;
p=p->next;
h=0;//改变h的值是使不为1
}
printf("%4d",p->ID);
m=p->password;//使m等于要删除节点的密码
p=p->next;
q->next=p;
}
}
void main()
{
ysfh *head=0;
int start,number;
char ch[5];
printf("请输入人数:");
scanf("%d",&number);
head=write(head,number);
gets(ch);//清除多输入的密码
printf("请输入起始数:");
scanf("%d",&start);
printf("出列顺序:");
read(head,number,start);
printf(" n");
}