最好是把算法写成框图~~~最好快点很着急用!!
#include"stdio.h"
#include"malloc.h"
typedef int Datatype;
typedef struct node //定义单链表结点
{ Datatype code;
Datatype num;
struct node *next;
}Linklist;
Linklist *creatsclist(int x) //创建链表
{ Linklist *p,*q,*H; //定义指针
int i,code; //定义空间数据和常量i
i=1;
H=(Linklist *)malloc(sizeof(struct node));//开辟空间
H->next=NULL;
p=H;
while(i<=x)
{
printf("请输入第%d人的密码:",i);scanf("%d",&code);printf("\n");
q=(Linklist *)malloc(sizeof(struct node)); //开辟空间
q->code=code;
q->num=i;
q->next=NULL;
p->next=q;
p=q; i++;
}
q->next=H->next; //尾结点链接到头结点的下一结点
return H;
}
void printlist(Linklist *H,int x)
{ Linklist *p; int i=1;
p=H->next;
if(p!=NULL)
while(i<=x) //循环
{ printf("%d,%d\t",p->num,p->code);
p=p->next;
i++;
}
printf("\n\n");
}
void Joseph(Linklist *H)
{ Linklist *p,*q,*v; //创建循环链表
int m,k; k=0;
p=H->next; q=H; //p为头结点后的数据,q指向头结点
printf("请输入报数上限值:"); scanf("%d",&m); printf("\n");
while(p!=q)
{ k++;
if(k==m) //当k=m时,输出p所指的结点的序号及密码,并将该结点的code作为新的m值,再次循环
{ printf("%d\t",p->num);
m=p->code; k=1;
if(H->next==p) H->next=p->next;
q->next=p->next; //将p所指的结点删除
v=p;
p=q->next;
free(v);//释放v的空间
}
q=p;
p=p->next; //继续循环
}
printf("%d\t",p->num);
printf("\n");
}
void main()
{ Linklist *H;
int x;
printf("请输入总人数:"); scanf("%d",&x); printf("\n");
H=creatsclist(x);
printf("输出每个人的编号,密码:\n");
printlist(H,x);
printf("约瑟夫环问题结果输出:\n");
Joseph(H);
}