n个人围成一圈,从第1个人开始顺序报号1、2、....k。凡报到k者推出圈子。找出最后留在圈子中的人原来的序号。本题要求用链表实现。n<50,k<50。 输入格式: 输入在一行中给出整数n和k。 输出格式: 输出一个整数 输入样例: 7 3 输出样例: 4 c语言写程序
时间: 2024-03-10 07:44:48 浏览: 53
有N个人围成一环形圈,第一个人从1开始报数,报道M的人出列,直到最后一个同学,请写出算法。.txt
下面是使用链表实现的 C 语言程序:
```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 *node = (Node *) malloc(sizeof(Node));
node->data = i;
if (head == NULL) {
head = node;
} else {
tail->next = node;
}
tail = node;
tail->next = head;
}
return head;
}
// 删除链表中第 k 个节点
Node *deleteNode(Node *head, int k)
{
Node *p = head;
// 找到要删除的节点的前一个节点
while (p->next->data != k) {
p = p->next;
}
Node *node = p->next; // 要删除的节点
p->next = node->next; // 删除节点
free(node);
return p->next;
}
int main()
{
int n, k;
scanf("%d %d", &n, &k);
Node *head = createList(n);
while (head->next != head) {
for (int i = 1; i < k; i++) {
head = head->next;
}
head = deleteNode(head, head->next->data);
}
printf("%d", head->data);
return 0;
}
```
阅读全文