把下面这个程序逐条翻译,就是说每条都是干什么用的,并且完善一下。。非常急,感谢各位高手了!!!/*约瑟夫环的程序设计*/#include#include#defineNull0typedef...
把下面这个程序逐条翻译,就是说每条都是干什么用的,并且完善一下。。非常急,感谢各位高手了!!!
/* 约瑟夫环的程序设计 */
#include
#include
#define Null 0
typedef struct tagnode
{
int num;
struct tagnode *next;
} LinkList;
LinkList *creat(int n);
LinkList *select(LinkList *head,int m);
LinkList *head=Null,*last;
int main()
{
int n,m,y;
printf("\nInput the total number of people:\n");
scanf("%d",&n);
printf("\ninput the number of person you are to call:\n");
scanf("%d",&m);
if(m==1)
{
y=1;
{
while (y<=n)
{printf("%4d\t",y);
y++;
}
printf("\nThe last one is:%d\n",n);
getch();
}}
else
{head=creat(n);
last=select(head,m);
n=last->num;
printf("the last one:%d\n",n);
free(last);
printf("\nPress any key to continue...\n");
getch();
return (1);}
} /* main */
LinkList *select(LinkList *head,int m)
{
LinkList *p,*q;
int i,t,flag=0;
p=head;
t=1;
q=p; /* q--前趋指针, p--当前指针 */
do
{
p=q->next;
t=t+1;
if(t%m==0)/* 报数到 */
{
printf("%4d\t",p->num);
if(q->next==q) { flag=1;break;}
q->next=p->next;
free(p);
p=q;
}
else q=p;
} while((q==p)||(flag==0));
head=p;
return (head);
}/* Select */
LinkList *creat(int n)
{
/* 使 n 个人围成一圈,并给每个人标识号数 */
LinkList *head,*s, *p;
int i;
s=(LinkList *)malloc(sizeof(LinkList));
head=s;
s->num=1;
p=s;
for(i=2;i<=n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->num=i;
p->next=s;
p=s;
}
p->next=head;
return (head);
}/* creat */
展开