小孩报数问题C语言链表
时间: 2023-11-23 08:08:54 浏览: 62
小孩报数问题可以使用循环链表来解决,具体实现步骤如下:
1. 定义一个结构体表示链表节点,包含一个数据域和一个指向下一个节点的指针。
```c
typedef struct node {
int data; // 数据域
struct node* next; // 指向下一个节点的指针
} Node;
```
2. 创建一个循环链表,首先需要输入小孩的总数和每次报数的数字。然后循环创建节点,并将节点链接起来形成循环链表。
```c
int n, m;
printf("请输入小孩的总数n和每次报数的数字m:");
scanf("%d%d", &n, &m);
Node* head = (Node*)malloc(sizeof(Node)); // 创建头结点
head->data = 1; // 头结点数据域存储编号为1的小孩
head->next = head; // 头结点指向自身
Node* tail = head; // 尾指针指向头结点,用于添加新节点
for (int i = 2; i <= n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点
newNode->data = i; // 新节点数据域存储小孩的编号
newNode->next = head; // 新节点指向头结点
tail->next = newNode; // 尾节点指向新节点
tail = newNode; // 尾指针指向新节点
}
```
3. 实现小孩报数并删除的过程。从头结点开始遍历链表,每次遍历到第m个节点时,将该节点从链表中删除。重复该过程,直到链表只剩下一个节点为止。
```c
Node* p = head; // 指针p指向头结点
while (p->next != p) { // 当链表不为空时
for (int i = 1; i < m-1; i++) { // 找到第m个节点的前一个节点
p = p->next;
}
Node* q = p->next; // 指针q指向第m个节点
p->next = q->next; // 删除第m个节点
printf("%d ", q->data); // 输出被删除的小孩编号
free(q); // 释放节点空间
p = p->next; // 指针p指向下一个节点
}
printf("%d", p->data); // 输出最后剩下的小孩编号
```
完整代码如下: