我正在编写一个程序来模拟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/

10-11 19:40