C:从双向链接队列中删除前节点

时间:2016-02-23 20:49:37

标签: c linked-list

我在概念化如何从双向链接队列中删除前节点时遇到了一些麻烦。我添加了一些其他代码,可以为您提供一些我正在使用的背景知识。我有一些关于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;    
}

2 个答案:

答案 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;   
}