ptaC语言链表n个人围成一圈,从第1个人开始顺序报号1、2、....k。凡报到k者推出圈子。找出最后留在圈子中的人原来的序号。本题要求用链表实现。n<50,k<50。
时间: 2024-03-16 19:43:44 浏览: 116
以下是一个C语言实现示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int num; // 编号
struct Node *next; // 指向下一个节点的指针
} Node;
// 构造循环链表
Node *createList(int n) {
Node *head = NULL;
Node *tail = NULL;
for (int i = 1; i <= n; i++) {
Node *p = (Node*)malloc(sizeof(Node));
p->num = i;
if (head == NULL) {
head = p;
} else {
tail->next = p;
}
tail = p;
}
tail->next = head; // 将尾节点指向头节点,形成循环链表
return head;
}
// 删除指定节点,并返回下一个节点的指针
Node *deleteNode(Node *p) {
Node *next = p->next;
p->num = next->num; // 将下一个节点的编号复制到当前节点
p->next = next->next; // 将当前节点的指针指向下下个节点,跳过中间的节点
free(next); // 释放中间节点的内存
return p->next; // 返回下一个节点的指针
}
// 主函数
int main() {
int n, k;
printf("请输入n和k:");
scanf("%d %d", &n, &k);
// 构造循环链表
Node *head = createList(n);
// 报数并删除节点,直到链表中仅剩一个节点
Node *p = head;
while (p->next != p) {
for (int i = 1; i < k; i++) {
p = p->next;
}
p = deleteNode(p);
}
// 输出最后留在圈子中的人原来的序号
printf("最后留在圈子中的人原来的序号是:%d\n", p->num);
return 0;
}
```
该代码使用循环链表实现了约瑟夫问题的求解,时间复杂度为O(nk),空间复杂度为O(n)。
阅读全文