M个人围成一圈,从第一个人开始顺序报号1,2,3....N凡报到"N"者退出圈子.找出最后
留在圈子中的人原来的序号.(N<M),看了下这个题目实在是想不出一个好的方法,各位大虾,谢谢了,最好是代码啊
M个人围成一圈,从第一个人开始顺序报号1,2,3....N凡报到"N"者退出圈子.找出最后
留在圈子中的人原来的序号.(N<M),看了下这个题目实在是想不出一个好的方法,各位大虾,谢谢了,最好是代码啊
2006-11-01 14:38
[此贴子已经被作者于2006-11-1 15:21:35编辑过]

2006-11-01 15:19
2006-11-01 16:48
#include<stdio.h>
#include<malloc.h>
typedef struct node{
int info;
struct node *next;
};
node *tbuildhlink(int n) /*带头节点的尾插法*/
{
node *head,*s,*p2;
int i=1;
head=(node *)malloc(sizeof(node));
p2=head;
while(i<=n)
{
s=(node *)malloc(sizeof(node));
s->info=i;
p2->next=s;
p2=s;
i++;
}
if(p2) p2->next=head;
return(head);
}
void Display(struct node* head)
{
node *p;
p=head->next;
if(!p)
{
printf("\nthe hlink is empty!");
}
else
{
printf("\nthe value of the hlink is:\n");
while(p!=head)
{
printf("%d--->",p->info);
p=p->next;
}
}
printf("^\n");
}
int delete_node(struct node *head,int n,int m)
{
int count=1,sum=n;
struct node *p,*pre;
pre=head;
p=pre->next;
while(sum>1)
{
if(p==head)
{
p=p->next;
}
if(count<m)
{
pre=p;
p=p->next;
count++;
}
if(count==m)
{
if(p==head)
{
p=p->next;
}
//printf("第%d个人出列.\n",p->info);
pre->next=p->next;
free(p);
p=pre->next;
count=1;
sum--;
}
}
return(pre->info);
}
int main()
{
struct node* head;
int n,m;
printf("输入n m:");
scanf("%d%d",&n,&m);
head=tbuildhlink(n);
Display(head);
//delete_node(head);
printf("最后剩下第%d个.\n",delete_node(head,n,m));
return(0);
}

2006-11-01 21:44
2006-11-01 23:29
我编了一个,可以在tc上运行,其做法是建立一个环链表,然后用 i 计数,当i%N==0时,打印p->num表示num出列
然后拆掉并释放结点p,再把下一结点赋予p...直到拆完为止。但要分N==1 和大于1两种情况
#include<malloc.h>
#define LEN sizeof(struct person)
struct person
{
int num;
struct person *next;
};
struct person *creat(int n)
{
struct person *head,*p1,*p2;
int i;
p1=p2=(struct person *)malloc(LEN);
head=NULL;
for(i=1;i<=n;i++)
{
if(i==1)
{head=p1;head->num=1;}
else
p2->next=p1;
p2=p1;
p1=(struct person *)malloc(LEN);
p1->num=i+1;
}
p2->next=head;
return(head);
}
main()
{
struct person *head,*p,*p2;
int M,N;
int i,j;
i=1;
j=1;
printf("\ninput M=:");
scanf("%d",&M);
printf("input N=:");
scanf("%d",&N);
head=creat(M);
p=head;
printf("\noutput:\n");
while(p!=NULL&&j<=M)
{
if(N==1)
{j=j+1;
printf("=>%d",p->num);
p=p->next;
}
else
{
p2=p;
p=p->next;
i=i+1;
if(i%N==0)
{
p2->next=p->next;
printf("=>%d",p->num);
p->next=NULL;
free(p);
p=p2->next;
i=i+1;
j=j+1;
}
}
}
getch();
}
[此贴子已经被作者于2006-11-3 8:40:26编辑过]

2006-11-03 00:09