我正在尝试使用此函数从队列前面删除一个值。它似乎第一次工作(虽然我可能错了)但是当第二次释放节点时它会触发一个崩溃程序的断点。我该如何解决这个问题?
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;
}
答案 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函数中的局部变量。正如其他人所示,你也必须改变实际的链表。