我正在编写一个程序来模拟CPU调度程序。因此,我正在实现一个双向链接列表以用作就绪队列。每当添加新流程时,都会创建一个流程控制块(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个PCB并进行打印会使我
PID:2 3
1丢失了,我不明白为什么。我仔细查看了if 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。
最佳答案
您是否在构造函数中将head和tail字段设置为NULL?如果不是,这可能会导致device::enqueuePCB内部问题。
关于c++ - 为什么我的函数不能打印出双向链接列表中的第一个节点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42786579/