从C中删除队列前面的值

时间:2014-02-06 11:19:09

标签: c queue

我正在尝试使用此函数从队列前面删除一个值。它似乎第一次工作(虽然我可能错了)但是当第二次释放节点时它会触发一个崩溃程序的断点。我该如何解决这个问题?

printf("Value removed = %d\n", dequeue(myQueue));

int dequeue(queue q)
{
    if (q == NULL || q->head == NULL)
    {
        return 0;
    }

    node * head = q->head;
    node * temp = head;

    if (temp == NULL)
    {
        return;
    }

    int returnValue = head->value;

    //Free first node in queue
    head = temp->next;
    free(temp);

    //Return value that was removed
    return returnValue;
}

3 个答案:

答案 0 :(得分:2)

您更新了本地变量,而不是更新队列结构head中的q

head = temp->next;  // this is local variable 

应该是:

q->head = temp->next;

答案 1 :(得分:0)

传回更新后的队列,以便在主函数中反映您的调用位置。或者您将只更改函数调用结束后将在堆栈中弹出的本地结构

myQueue = dequeue(myQueue));


int dequeue(queue q)
{
if (q == NULL || q->head == NULL)
{
    return NULL;
}

node * temp = q->head; 

printf("Value removed = %d\n",head->value);

//Free first node in queue
q->head = temp->next;  
free(temp);

return q->head;

}

答案 2 :(得分:0)

您是否将queue作为指针键入?这是非常糟糕的风格,不要做,永远!它使代码完全不可读。

否则,如果你还没有这样做,你也不应该按值传递结构。如果你已经这样做了,你需要重新设计整个程序,以便它使用指针。所有功能都应该与int dequeue(queue* q)

一致

在上述任何一种情况下,您都需要退后一步,将整个链表ADT重新定义为有意义的内容。

此外,仅此一点无济于事,因为您只使用了dequeue函数中的局部变量。正如其他人所示,你也必须改变实际的链表。