最近在恶补c语言,昨天在做一个“选出猴王”的小练习题,应该也有人遇到过这个题,大概就是好多猴子围成一圈,编成号,从1-N,然后从1号开始报数,顺时针猴子依次报数加1,如果有猴子报的数字是M则出列,下只猴子继续从1号开始报数,依次循环,最后一个出列的就是猴王,本来这道题感觉也不怎么难,想着用一个循环链表就可以搞定,但是在用到结构体的时候就出现问题了,请各位大虾们给小弟指点迷津一下。
代码如下:
#include
#include
typedef struct List{
int data;
struct List *next;
}*monkey;
int main(void)
{
struct List *start,*Monkey,*end;
int count = 1,NumofMonkey,stride,i;
printf("请输入猴子的总数:");
scanf("%d",&NumofMonkey);
printf("请输入出局的数字:");
scanf("%d",&stride);
start = NULL;
for(i=0;i
Monkey = (struct List*)malloc(sizeof(struct List));
//如果写成Monkey = (monkey)malloc(sizeof(monkey));就有问题了
//现在就搞不懂该如何来动态分配空间了,求指导!
Monkey->data = i+1;
if(start == NULL){
start = end = Monkey;
start->next= start;
}
else{
Monkey->next = end->next ;
end->next = Monkey;
end = Monkey;
}
}
while(start != NULL){
if(start->next == start){
printf("%4d\n",start->data);
free(start);
start->next = NULL;
break;
}
if(count == stride-1){
Monkey = start->next;
start->next = Monkey->next;
printf("%4d",Monkey->data);
free(Monkey);
Monkey->next = NULL;
count = 0;
}
count++;
start = start->next ;
}
return 0;
}