我正试图让我的出队列方法用于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
正如您已经看到的,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的定义。LinkedQueue
中是否也可能存在->tail
?如果是这样,那么您就不需要迭代,而是可以使用->tail
来定位temp
(当然:您必须将->tail
更新到新的端)。
您的输出似乎是队列/FIFO的正确行为,因为从列表中删除的第一个项就是添加到列表中的第一个项目。您是否正在尝试创建堆栈?