C++编程实现 有 n 个人排队,1号排在 2号前面,2号排在 3号前面,...,以此类推 n-1号排在 n 号前面。在这个过程中,偶尔老师会把某个人叫走,叫走之后这个人就离开了队伍,假设本来 a 排在 b 前面,b 排在 cc前面,b被叫走后 a 就排在了 c前面。老师偶尔也会感到疑问,她想知道此时排在 a 号前面的同学是几号呢? 已知老师一共会有 k次操作,每次会执行下面的一种: 1.1. 把 x 叫走。 2.2. 求排在 x 前面的是谁。
时间: 2023-02-07 12:01:56 浏览: 61
在 C 语言中,可以使用结构体(struct)来表示一个人的信息,包括他的编号和指向前一个人的指针。
例如:
struct Person {
int number;
struct Person *prev;
};
可以使用这样的结构体来创建一个链表,表示所有排队的人。每次叫走一个人时,就把他从链表中删除即可。
求排在某个人前面的同学时,可以使用这个人的 prev 指针访问前一个人的信息。
例如,如果要求排在 2 号同学前面的是谁,就可以使用 2 号同学的 prev 指针访问 1 号同学的信息。
下面是一个示例代码,实现了上述功能:
#include <stdio.h>
#include <stdlib.h>
struct Person {
int number;
struct Person *prev;
};
// 创建一个链表,表示 n 个人的排队信息
struct Person *create_queue(int n) {
struct Person *head = NULL;
struct Person *tail = NULL;
for (int i = 1; i <= n; i++) {
struct Person *p = malloc(sizeof(struct Person));
p->number = i;
p->prev = NULL;
if (tail) {
tail->prev = p;
}
tail = p;
if (!head) {
head = p;
}
}
return head;
}
// 从链表中删除编号为 x 的人
void remove_person(struct Person **head, int x) {
struct Person *p = *head;
while (p && p->number != x) {
p = p->prev;
}
if (!p) {
return; // 没有找到编号为 x 的人
}
if (p == *head) {
*head = p->prev;
} else