Chinaunix首页 | 论坛 | 博客

分类: C/C++

2012-09-09 15:41:03

约瑟夫问题:编号是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) |
给主人留下些什么吧!~~