13个人围成一圈,从第1个人开始顺序报号1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。要求用链表实现。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int num;
struct Node* next;
} Node;
Node* createCircle(int n) {
Node* head = (Node*)malloc(sizeof(Node));
head->num = 1;
Node* prev = head;
for (int i = 2; i <= n; i++) {
Node* node = (Node*)malloc(sizeof(Node));
node->num = i;
prev->next = node;
prev = node;
}
prev->next = head;
return head;
}
int findLastPerson(Node* head) {
Node* current = head;
Node* prev = NULL;
while (current->next != current) {
for (int i = 1; i < 3; i++) {
prev = current;
current = current->next;
}
prev->next = current->next;
free(current);
current = prev->next;
}
int lastPerson = current->num;
free(current);
return lastPerson;
}
int main() {
Node* circle = createCircle(13);
int lastPerson = findLastPerson(circle);
printf("The last person left is number %d.\n", lastPerson);
return 0;
}
代码解释:
1. 定义链表节点结构体:定义一个链表节点结构体 `Node`,包含一个整数(表示编号)和指向下一个节点的指针。
2. 创建环形链表:创建一个包含13个节点的环形链表,模拟13个人围成一圈。
3. 报数退出:从第一个节点开始依次报数,每报到3的节点退出,直到剩下最后一个节点。最后输出剩下的节点的编号。