在链接列表中出列

时间:2012-02-09 06:49:23

标签: c queue linked-list ansi

我正在尝试将我的dequeue方法用于实现LinkedList ADT。但是,它从队列的开头而不是结束中删除。对此有何帮助?我是C的新手,我正在尝试将一个java练习移植到C ..它应该删除列表的最后一个节点。

这是我的出列方法:

static void linkedQueueDequeue(Queue* q) {
    LinkedQueue *lq = ((LinkedQueue*)q->privateData);
    Node* temp = lq->head->next;
    lq->head->data = lq->head->next->data;
    lq->head->next = temp->next;
    free(temp);
    lq->size--;


}

这是尝试将最后一个节点出列时的输出:

=====================
|Testing LinkedQueue|
=====================
adding 1 to first node
adding 2 to second node
adding 3 to third node
adding 4 to fourth node
[1,2,3,4]
dequeue last node
should print [1,2,3]
[2,3,4]
return first node
peek: 2
what's the size?
size: 3

2 个答案:

答案 0 :(得分:1)

正如您所看到的,linkedQueueDequeue中的代码弹出第一个条目,就像您想要一个堆栈(LIFO)一样,您可以将temp迭代到列表的末尾,然后删除它temp->next

static void linkedQueueDequeue(Queue* q) {
    LinkedQueue *lq = ((LinkedQueue*)q->privateData);
    Node* temp = lq->head->next;
    while(temp->next) temp = temp->next;
    free(temp->next);
    temp->next = 0;
    lq->size--;
}

另请注意,考虑到第2行中的转换(LinkedQueue*)q,您的Queue / LinkedQueue实现有些奇怪。您确定需要该转换吗?我无法告诉你,因为你没有给我们Queue和LinkedQueue的定义。 ->tail中是否还有LinkedQueue?如果是这样,那么你不需要迭代,而是可以使用->tail来定位temp(当然:你必须将->tail更新到新的一端)。

答案 1 :(得分:0)

您的输出似乎是队列/ FIFO的正确行为,因为要从列表中删除的第一个项目是添加到列表中的第一个项目。您是否尝试创建堆栈?