最近在恶补c语言,昨天在作一个“选出猴王”的小练习题,应该也有人遇到过这个题,大概就是好多猴子围成一圈,编成号,从1-N,而后从1号开始报数,顺时针猴子依次报数加1,若是有猴子报的数字是M则出列,下只猴子继续从1号开始报数,依次循环,最后一个出列的就是猴王,原本这道题感受也不怎么难,想着用一个循环链表就能够搞定,可是在用到结构体的时候就出现问题了,请各位大虾们给小弟指点迷津一下。 ide
代码以下: code
#include<stdio.h> #include<stdlib.h> 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<NumofMonkey;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; }