我的 pop 功能似乎无法正常工作。基本上,我的队列有一个指向第一个和最后一个元素的指针。
我的 pop 函数首先释放第一个元素并将其指定为 NULL 。
然后它使用指针 curr 每次都到达下一个元素,直到找到 NULL 。
最后,我队列中的第一个指针被分配给上一页,指向 curr 达到null之前的最后一个元素。
#include <stdlib.h>
struct Queue {
struct Node* first;
struct Node* last;
};
struct Node {
Item val;
struct Node* next;
};
void initQueue (struct Queue **queue){
(*queue) = malloc(sizeof(struct Queue));
(*queue)->first = NULL;
(*queue)->last = NULL;
}
struct Node* createNewNode(){
struct Node *newNode;
newNode = malloc(sizeof(struct Node));
newNode->next = NULL;
return newNode;
}
void push (Item val, struct Queue *queue){
struct Node* newNode = createNewNode();
newNode->val = val;
if(queue->first == NULL){
queue->first = newNode;
queue->last = newNode;
}
else{
newNode->next = queue->last;
queue->last = newNode;
}
}
void pop(struct Queue *queue){
struct Node* curr = queue->last;
struct Node* prev = queue->last;
free(queue->first);
queue->first = NULL;
while(curr != NULL){
prev = curr;
curr = curr->next;
}
queue->first = prev;
}
答案 0 :(得分:2)
要从列表的正面弹出,只需将first
指向first->next
即可。
void pop(struct Queue *queue)
{
if (NULL != queue->first) {
struct Node *first = queue->first;
// Update first ptr
queue->first = queue->first->next;
free(first);
// Only need to update tail if list is empty
if (NULL == queue->first) {
queue->last = NULL;
}
}
}
修改强> 根据你的评论看起来你看不到我在做什么,所以这是一个例子。
假设队列如下所示:
queue->first
↓
A→B→C→D←queue->last
首先,制作一个临时指针,并指向queue->first
。然后移动queue->first
,使其指向queue->first->next
。该列表现在看起来像:
queue->first
↓
A→B→C→D←queue->last
↑
first
(临时变量)
然后,删除temp var,列表为:
queue->first
↓
B→C→D←queue->last
编辑2 我还注意到您的push
功能不正确。在队列中,您将新项目添加到列表的末尾并从前面获取项目(FIFO - 先进先出)。喜欢排队看节目的人。 第一个到达那里并排队的人将是第一个进入剧院的人。并且最后的人到达后面。所以push
应该是:
void push (Item val, struct Queue *queue){
struct Node* newNode = createNewNode();
newNode->val = val;
if(queue->first == NULL) {
queue->first = newNode;
queue->last = newNode;
}
else{
queue->last->next = newNode; // Add to END of list
queue->last = newNode;
}
}