从pop函数返回错误的地址

解决了我的结构的其他问题后,我的推送按预期工作,但是我的pop返回错误的地址,我不知道为什么 –

QNode* const Q_Pop(Q* const pointerQ){ ... // empty check QNode* tempNode = pointerQ->front.next; pointerQ->front.next = (tempNode->next); tempNode->next->prev = &(pointerQ->front); return tempNode; } 

我相当确定我的实际删除和重新链接堆栈的逻辑是正确的但我使用指针并返回它们是混乱的。

结构 –

 struct QueueNode { struct QueueNode *prev; /* Previous list element. */ struct QueueNode *next; /* Next list element. */ }; typedef struct QueueNode QNode; struct Queue { QNode front; // sentinel node at the front of the queue QNode rear; // sentinel node at the tail of the queue }; typedef struct Queue Q; 

谢谢您的帮助!

你不应该使用“哨兵节点”; 这毫无意义,令人困惑。 队列可以简单地表示为第一个元素的QNode* 。 它始终指向第一个元素; 如果为NULL ,则队列为空; 如果element->nextNULL ,则它是最后一个元素,因为没有下一个元素。 使用它非常简单。

 struct QueueNode { // stuff // stuff // stuff struct QueueNode* prev; // this may be optional struct QueueNode* next; }; typedef struct QueueNode QNode; void push_front(QNode** queue, QNode* pushme) { pushme->prev = NULL; pushme->next = *queue; (*queue)->prev = pushme; *queue = pushme; } void push_end(QNode** queue, QNode* pushme) { QNode* node = *queue; if (node) { while (node->next) node = node->next; node->next = pushme; pushme->prev = node; pushme->next = NULL; } else { *queue = pushme; (*queue)->next = (*queue)->prev = NULL; } } QNode* pop_front(QNode** queue) { QNode* node = *queue; if (node) *queue = node->next; return node; } QNode* pop_end(QNode** queue) { QNode* node = *queue; if (node) { while (node->next) node = node->next; if (node->prev) { node->prev->next = NULL; node->prev = NULL; } else *queue = NULL; } return node; } QNode* create_node_front(QNode** queue) { QNode* node = malloc(sizeof(QNode)); push_front(queue, node); return node; } QNode* create_node_end(QNode** queue) { QNode* node = malloc(sizeof(QNode)); push_end(queue, node); return node; } QNode* my_queue = NULL; // declare an empty queue QNode* my_node = create_node_end(&my_queue); // create a new node, its already stored in the queue 

我没有测试它,但它提供了一个大致的想法。

您可以使用push_front()create_node_front() (无循环,最佳性能)进行pop_end()然后使用pop_end()弹出以获得队列效果( FIFO ),或使用pop_front()弹出以获得堆栈效果( LIFO )。