c - 弹出堆栈不起作用吗? (从两个队列入栈)

标签 c

我已经为这个问题苦恼了一段时间,我似乎不太明白为什么在执行时,当以下函数执行时,以及 main 中的测试代码调用以查看堆栈是否为空,由于某种原因,事实并非如此。我似乎无法弄清楚确切的原因,虽然我有一种感觉,它与“删除”功能不删除最后一个节点有关,但由于某种原因,我不知道如何修复它。

TYPE listStackPop (struct Stack* stack)
{
    /* FIXME: You will write this function */
    assert (stack != NULL);
    assert (!listQueueIsEmpty (stack->q1));
    return listQueueRemoveFront (stack->q1);
}

---later calls to listQueueRemoveFront---

TYPE listQueueRemoveFront (struct Queue* queue)
{
    /* FIXME: You will write this function */
    assert (queue != 0);
    assert (!listQueueIsEmpty (queue));
    struct Link* toDelete;
    toDelete = queue->head->next;
    if (toDelete == queue->tail) {
        queue->tail = queue->head;
    }
    else {
        queue->head->next = toDelete->next;
    }
    int retVal = toDelete->value;
    return retVal;
}

--For clarity, TYPE is defined as int--

我尝试从简单地返回 toDelete->value 到将 toDelete 的值复制到 int,然后传递要返回的 int,因为我认为 toDelete 可能被过早删除或其他什么原因,但事实并非如此。 不幸的是,谷歌也没有太多这方面的信息。无论如何,到目前为止。

这里是pastebin上的完整代码,如果有人有兴趣阅读全文:https://pastebin.com/cDvdHmTu

我原以为它会通过,但由于某种原因,即使所有其他测试用例都通过了,它还是失败了。

结果:

-------------------------------------------------
---- Testing stack from queue implementation ----
-------------------------------------------------
stack init...
stackIsEmpty == 1:      PASSED

pushing 4, 5, -300...
stackIsEmpty == 0:      PASSED

popping; val == -300:   PASSED
popping; val == 5:      PASSED
top val == 4    :       PASSED
popping; val == 4:      PASSED
stackIsEmpty == 1:      FAILED

pushing 0-9...
top val == 9    :       PASSED

C:\Users\Zedri\source\repos\Stack From Queues\Debug\Stack From Queues.exe (process 8928) exited with code 0.
Press any key to close this window . . .

使用的编译器/IDE:Visual Studio 2019

-~-~-~编辑1~-~-~-

删除了对 toDelete 指针的 malloc 调用

~-~-~-编辑2-~-~-~

修复了 Pastebin 上的代码。问题已解决。

最佳答案

没关系,我只需要将 queue->head->next = toDelete->next; 移到 else block 之外,并完全删除 else block 。

关于c - 弹出堆栈不起作用吗? (从两个队列入栈),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56048179/

相关文章:

c - 输入某些值时如果出错则嵌套

c - 将链表节点插入升序单链表GCC错误: dereferencing pointer to incomplete type

c - 跨平台 C 应用程序的 UTF8 支持

C 递归程序无法通过 GCC 编译

C变量混淆

c - 具有 `for` 循环的菱形输出

c - C中Blowfish加密的适配问题

c - C 中的简单加密函数

c - C 中的链表插入

c - 将文件中的数字输入到 char 数组中