约瑟夫问题:编号是1,2,3,4,。。。n 的n个人按顺时针围坐在一起,每个人持一个密码,一开始任选一个整数,作为他的上线m,从第一个人开始顺时针安1开始顺序报数,报到m 停止,报m 的人出列,将他的密码作为新的m值。。就这样继续下去,打印出列的每个人编号。
typedef struct elem
{
int date; //他的密码
int datebase; //用这个来记录元素的序号
struct elem *next;
}Node;
Node *h;
Node* creat ()
{
Node *s,*r;
int x;
int i=1;
h = (Node*)malloc (sizeof (Node));
h->next = NULL;
r = h;
printf ("input number:");
scanf ("%d",&x);
while (x)
{
s = (Node*)malloc (sizeof (Node));
s->date =x;
s->datebase=i;
i++;
r->next = s;
r = s;
printf ("input number:");
scanf ("%d",&x);
}
r->next = h;
return h;
}
int yuuse()
{
Node *r,*p,*q;
int total = 7;
int i,m=20;
r = h;
p = h->next;
while (total!=1)
{
for (i=1;i
{
r = p;
p = p->next;
if (p==h) //这是这个程序的重点。就是在循环的时候,一旦到了头节点,要避头节点。
{
r= p;
p=p->next;
}
}
if (1)
{
printf ("%d\n",p->datebase);
m = p->date;
q=p;
r->next= p->next;
p = p->next;
total--;
free (q);
}
if (h==p)
{
r = p;
p = p->next;
}
}
if (total==1)
{
printf ("%d",h->next->datebase);
}
return 0;
}
int main ()
{
creat();
yuuse();
}
阅读(1374) | 评论(0) | 转发(0) |