gpt4 book ai didi

c++ - 为什么我的函数不打印出双向链表中的第一个节点?

转载 作者:行者123 更新时间:2023-11-30 02:26:30 25 4
gpt4 key购买 nike

我正在编写一个程序来模拟 CPU 调度程序。因此,我正在实现一个双向链表以用作就绪队列。每当添加新进程时,都会创建一个进程控制 block (PCB) 并将其添加到就绪队列中。每个 PCB 都有一个唯一的 PID。因此,每当添加新 PCB 时,我都会将 PID 递增 1。

pid += 1;
currentDevices[0].enqueuePCB(pid);
//currentDevices[0] represents the ready queue. There are other queues as well

这是我的 enqueuePCB 函数:

void device::enqueuePCB(int num)
{
pcb* newPCB = new pcb();
newPCB -> pid = num;
newPCB -> next = NULL;
newPCB -> prev = NULL;

if (head == NULL)
{
head = tail = newPCB;
queueLength += 1;
}
else
{
pcb* temp = tail;
newPCB -> next = tail;
temp -> prev = newPCB;
tail = newPCB;
queueLength += 1;
}
}

和我的打印功能

void device::snapReadyQueue()
{
pcb* temp = head;
cout << "PID: ";
while (temp != NULL)
{
cout << temp -> pid << " ";
temp = temp -> prev;
}
cout << endl;
}

当我测试我的程序时,只添加一个 PCB 并打印结果为空白“PiD:”。然而,一旦我开始添加更多的 PCB 并打印,我实际上可以检索其他 PCB 的 PID。例如,在第一个打印电路板之后再添加 2 个打印电路板将得到我

PID: 2 3

缺少 1,我不明白为什么。我查看了我的入队 if else 语句,这似乎是有道理的。我也尝试过使用单向链表,但它不起作用。

更新经过一些测试后,我意识到这可能与我在初始化队列之前使用的 if-else 语句有关。

 if (processCount == 0)
{
cout << "Currently no processes in the ready queue.\nAvailable commands: A: ";
cin >> call;
if (call == "A")
{
pid = 1;
currentDevices[0].enqueuePCB(pid);
processCount += 1;
run();
}
}
else
{
cout << "Please enter call: ";
cin >> call;
if (call == "A")
{
pid += 1;
currentDevices[0].enqueuePCB(pid);
processCount += 1;
run();
}

我在第一次入队时尝试只打印头部,但我的程序崩溃了。然而,当我添加第二个 PCB 时,头部指向 PID 2。

最佳答案

我认为向列表添加元素的代码是错误的,你说:

    pcb* temp = tail;
newPCB -> next = tail;
temp -> prev = newPCB;
tail = newPCB;
queueLength += 1;

假设 tail 是指向列表最后一个元素的指针,我们可以跟踪这里发生的事情。让我们现在忘记 temp,您告诉 newPCB 它的下一个元素是尾部(当前的最后一个元素)。接下来,您告诉 tail 它的前身是 newPCB,然后您将 newPCB 设为 tail。因此,tail 是 newPCB,它的前一个元素是 NULL 但它的下一个元素是之前的 tail。我想你的意思是:

    tail -> next = newPCB;
newPCB -> prev = tail;
tail = newPCB;

关于c++ - 为什么我的函数不打印出双向链表中的第一个节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42786579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com