13个人围成一圈,从第一个人开始顺序报号1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。要求用c语言链表实现,直接给出完整代码
时间: 2023-01-28 21:45:11 浏览: 97
在这里给出的是一个可以实现上述功能的 C 语言链表代码:
```
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct node {
int data;
struct node* next;
} Node;
// 创建链表
Node* createList(int n) {
Node* head = NULL;
Node* tail = NULL;
for (int i = 1; i <= n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = i;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
tail->next = head; // 将尾节点的 next 指向头节点,形成环状链表
return head;
}
// 找出最后留在圈子中的人原来的序号
int findLastNumber(Node* head, int m) {
Node* curr = head;
Node* prev = NULL;
while (curr->next != curr) { // 圈子中还有人
for (int i = 1; i < m; i++) { // 找到要退出圈子的人
prev = curr;
curr = curr->next;
}
prev->next = curr->next; // 删除节点
free(curr);
curr = prev->next;
}
return curr->data; // 返回最后留在圈子中的人的原来的序号
}
int main() {
int n = 13; // 圈子中的人数
int m = 3; // 每次报数的数字
Node* head = createList(n);
int lastNumber = findLastNumber(head, m);
printf("The last number is: %d\n", lastNumber);
return 0;
}
```
在这段代码中,我们使用了一个名为 `Node` 的结构体来表示链表节点,该结构体包含一个数据域和一个指向下一个节
阅读全文