我在概念化如何从双向链接队列中删除前节点时遇到了一些麻烦。我添加了一些其他代码,可以为您提供一些我正在使用的背景知识。我有一些关于remove_queue函数的东西,但我不确定它是否正确或如何完成它。
struct Queue {
int size;
struct QueueNode *dummy_head_node_ptr;
};
struct QueueNode {
int value;
struct QueueNode *prev_node_ptr;
struct QueueNode *next_node_ptr;
};
void init_queue(struct Queue *queue_ptr) {
struct QueueNode *node_ptr;
// Create a dummy node and make it to point to itself
node_ptr = (struct QueueNode *)malloc(sizeof(struct QueueNode));
node_ptr->prev_node_ptr = node_ptr;
node_ptr->next_node_ptr = node_ptr;
// Set the queue struct to have a size of zero and
// point to the dummy node
queue_ptr->size = 0;
queue_ptr->dummy_head_node_ptr = node_ptr;
}
void insert_queue(int value, struct Queue *queue_ptr)
{
struct QueueNode *new_node_ptr;
new_node_ptr = (struct QueueNode *)malloc(sizeof(struct QueueNode));
new_node_ptr->next_node_ptr = queue_ptr->dummy_head_node_ptr;
new_node_ptr->prev_node_ptr = queue_ptr->dummy_head_node_ptr->prev_node_ptr;
queue_ptr->dummy_head_node_ptr->prev_node_ptr->next_node_ptr = new_node_ptr;
queue_ptr->dummy_head_node_ptr->prev_node_ptr = new_node_ptr;
new_node_ptr->value = value;
queue_ptr->size++;
}
int remove_queue(struct Queue *queue_ptr)
{
assert(queue_ptr->size > 0);
queue_ptr->dummy_head_node_ptr->prev_node_ptr->next_node_ptr = queue_ptr->dummy_head_node_ptr->prev_node_ptr;
queue_ptr->dummy_head_node_ptr->prev_node_ptr = NULL;
queue_ptr->size = queue_ptr->size - 1;
return queue_ptr->dummy_head_node_ptr->next_node_ptr->value;
}
答案 0 :(得分:2)
... -->[tail]<--->[dummy_head_node_ptr node]<--->[head]<--->[2nd node]<-- ...
^
|
queue.dummy_head_node_ptr
使用图表可以帮助您阐明需要执行的操作。让我们尝试删除[head]节点。我们知道我们需要将[第二节点]和[第二节点]的prev下面的dummy_head_node_ptr设置为[dummy_head_node_ptr节点]。
因此,在这种情况下,我们只想将dummy_head_node_ptr-&gt; next_node_ptr作为head的next_node_ptr指向的内容。我们可以用
做到这一点dummy_head_node_ptr->next_node_ptr = dummy_head_node_ptr->next_node_ptr->next_node_ptr;
但是,它的不良做法是泄漏内存,所以不要忘记释放头节点。
因此将dummy_head_node_ptr-&gt; next_node_ptr保存到临时变量中。然后在最后释放它。
答案 1 :(得分:1)
你必须记住头节点。将头节点的成功放在头节点的位置。记住头节点和value
头节点的成员free
。
int remove_queue(struct Queue *queue_ptr)
{
assert(queue_ptr->size > 0);
if ( size == 0 )
return queue_ptr->dummy_head_node_ptr->value;
struct QueueNode *firstNode = queue_ptr->dummy_head_node_ptr->nextNode;
int value = firstNode->value; // remember value of first node
queue_ptr->size--; // decrement number of nodes
struct QueueNode *nextNode = firstNode->next_node_ptr;
queue_ptr->dummy_head_node_ptr = nextNode; // new head is successor of head node
nextNode->prev_node_ptr = queue_ptr->dummy_head_node_ptr; // predecessor of new head node is queue_ptr->dummy_head_node_ptr
// if queue_ptr->size == 0 then nextNode == queue_ptr->dummy_head_node_ptr
free( firstNode ); // free first node
return value;
}