用链表做报数问题
记得以前学长叫我们做过这样一题有n个人围成一圈,顺序排号。从第一个人开始报数(从1到x报数),凡报到x的人退出圈子,问最后留下的是原来第几号的那个人。之前是用动态数组做的,今天突然来了兴趣 想用循环链表试试 顺便巩固下链表
以下附上代码
#include<stdio.h>
#include<malloc.h>
typedef struct Circle
{
int date;
Circle *next;
};
void CreatCircle(Circle *head, int n)//创建链表
{
Circle *p,*q;
p = head;
for (int i = 1; i < n; i++)//开始存入号数
{
q = (Circle *)malloc(sizeof(Circle));
q->date = i + 1;
p->next = q;
p = q;
q = q->next;
}
p->next = head;//尾指针指向表头,围成一圈 循环链表
}
void Delete(Circle *p)//删除报到倒霉数的节点(指针的下一个节点)
{
Circle *q;
q = p->next;
p->next = p->next->next;
free(q);
}
Circle *GameBegin(int n,int j)//开始游戏
{
Circle *p,*head;
head = (Circle *)malloc(sizeof(Circle));//创建表头,号数为一
head->date = 1;
CreatCircle(head, n);
p = head;
for (int i = 2; p->next != p;)//报到倒霉数的删除节点 知道剩最后一个节点
{
i++;//开始报数
p = p->next;
if (i%j == 0)
{
//printf("%d", p->next->date);
Delete(p);
i++;
}
}
return p;
}
void main()
{
int people,num;
printf("游戏人数为:");
scanf_s("%d", &people);
printf("设置倒霉数为:");
scanf_s("%d", &num);
printf("剩下的幸运者为:%d",GameBegin(people, num)->date);
free(GameBegin(people, num));
}
以后也会把其他问题做下拓展用别的方法再做一遍。