问题:
有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到3的人退出圈子,下一个人从1开始报数,报到3的人退出圈子。如此下去,直到留下最后一个人。请按退出顺序输出退出圈子的人的编号
思路:
用数据结构中的循环链表解决此题
代码:
#include<stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node* next;
}Node,*PNode;
typedef struct point {
PNode head;
PNode tail;
}Point;
void init(Point* p) {
p->head = (PNode)malloc(sizeof(Node));
p->tail = p->head;
printf("input the num of people\n");
int pNum;
scanf("%d", &pNum);
for ( int i = 0; i < pNum; i++)
{
PNode tPoint= (PNode)malloc(sizeof(Node));
p->tail->next = tPoint;
p->tail = tPoint;
p->tail->num = i+1;
}
p->tail->next = p->head->next;
}
int counting(Point* p) {
int count = 0;
PNode pNow = p->head;
while(pNow->next != pNow){
pNow = pNow->next;
count++;
if (count==2) {
PNode pTemp = pNow->next;
pNow->next = pNow->next->next;
free(pTemp);
count = 1;
pNow = pNow->next;
}
}
return pNow->num;
}
void print(Point* p) { //test
PNode pNow = p->head;
pNow = pNow->next;
do{
printf("%d\n", pNow->num);
pNow = pNow->next;
}while (pNow->next != p->head->next);
}
int main()
{
Point p;
init(&p);
// print(&p);
int count = counting(&p);
printf("the last people is %dth", count);
return 0;
}