【问题标题】:Linked list implementation of queue in C-about empty condition and free [closed]C中队列的链表实现-关于空条件和空闲[关闭]
【发布时间】:2025-12-30 07:45:06
【问题描述】:

这是从我已经创建的队列中删除最前面的项目的代码。 我试图理解 itemPtr 将以某种方式在 main 中使用.. 尚不清楚,但这不是重点。 我想知道是否

if (queue->count == 0)

可以代替

if (!queue->count)

NULL和0的用法一样吗?

添加,这是做什么的?

free(deleteLoc)

我认为dequeue方法结束后deleteLoc会消失,但为什么要添加这个?这不是我的代码,所以我很好奇。它是否消除了 deleteLoc 包含的内存或 queue->front ? 不就是让数据本身消失吗?

谢谢。

bool dequeue(H* queue ,void* itemPtr)
{
    node* deletecLoc;
    if (!queue->count)
        return false;
    *itemPtr = queue->front->dataPtr;
    deleteLoc = queue->front;
    if (queue->count == 1)
        queue->front = queue->rear = NULL;
    else
        queue->front = queue->front->next;
    (queue->count)--;
    free(deleteLoc);
    return true;
}

【问题讨论】:

标签: c data-structures queue free


【解决方案1】:

不知道

if (queue->count == 0)

可以代替

if (!queue->count)

是的,您始终可以通过显式比较来表达与零的隐式比较,反之亦然。

NULL0 的使用方式相同吗?

ifwhile 和其他控制语句执行的隐式零比较的上下文中,与NULL 的比较和与零的比较的行为方式相同。

这是做什么的?

free(deleteLoc)

要了解这一点,您需要查看enqueue 的代码并找到对malloccalloc 的调用。本质上,freemalloc 的“撤消”,告诉系统您不再使用动态分配给它的内存。

它会抹去deleteLoc 包含的内存还是queue->front

它可能会也可能不会更改deleteLoc 指向的内存内容,但这并不重要,因为该内存成为您程序的禁区:在调用free 后访问它是未定义的行为.

【讨论】:

    【解决方案2】:

    if (queue->count == 0) 将执行与 if (!queue->count) 完全相同的操作,因为在 C 中,如果某事物的计算结果为 0,如果将其视为布尔值,它将计算结果为 false

    在这种情况下,是的,NULL0 将实现相同的目标。 NULL 指的是一个 空指针,而 0 通常是数字零,但它们的计算结果相同。

    最后,free 将摆脱之前分配的内存。您尚未显示所有代码,但在 insert 函数的某处,将有一个 malloc(或类似函数)为您分配内存以存储您的节点。Free 摆脱了该内存并当你完成一个节点时,你需要调用它。

    【讨论】:

    • 实际上在 C 中,NULL 的类型通常为 void *。这(语义上)与int0 非常不同。这两者不应该真的混为一谈。
    最近更新 更多