击鼓传花
题目描述:有N个小朋友围成一圈玩击鼓传花游戏,将小朋友编号为1~N,从1号开始传花,每次传3个,拿到花的小朋友表演节目后退出,任给N,问最后一个表演的小朋友编号是多少?
例如:5个小朋友,从1号开始传花,第一个表演的是3号,第二个表演的是1号,第三个表演的是5号,第四个表演的是2号,最后一个表演的是4号。(建议用链表实现)
输入描述:输入一个整数N,N不超过100。
输出描述:输出最后一个表演的小朋友编号在单独的一行。
C语言代码:循环列表实现
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node;
int main()
{
int n;
scanf("%d", &n);
node * head = (node *)malloc(sizeof(node));
head->data = 1; head->next = NULL;
node * p, *q;
p = head;
//if (n == 1) return printf("1");
for (int i = 2; i <= n; i++) //创建循环链表
{
q = (node *)malloc(sizeof(node));
q->data = i; q->next = NULL;
p->next = q;
p = p->next; //移动指针
}
p->next = head; //也就是尾节点和头节点链接起来
p = head; //从第一个开始传
while (n > 1)
{
p = p->next;//传到第三个的上一个,中间那个
q = p->next;//记录第三个
p->next = q->next;//删掉第三个,剪开链接
p=p->next;//移动指针
free(q);//释放第三个
n--;
}
printf("%d", p->data);
return 0;
}
判题系统原来定义结构体时没加typedef,导致编译错误,一定要加上typedef,并记得移动指针。