C 从pop函数返回错误地址
在解决了我的struct的其他问题后,我的推送按预期工作,但是我的pop返回了错误的地址,我不知道为什么-C 从pop函数返回错误地址,c,pointers,struct,stack,C,Pointers,Struct,Stack,在解决了我的struct的其他问题后,我的推送按预期工作,但是我的pop返回了错误的地址,我不知道为什么- QNode* const Q_Pop(Q* const pointerQ){ ... // empty check QNode* tempNode = pointerQ->front.next; pointerQ->front.next = (tempNode->next); tempNode->next->prev
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->next
为NULL
,则它是最后一个元素,因为没有下一个元素。处理这个问题很简单
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_front()
进行弹出以产生堆栈效果()。必须查看更多代码,但看起来指针q->front可能会指向队列的头部。你会把它退回,而不是下一个。但是,如果看不到数据结构,我就说不出来。我猜你想弹出当前对象,即pointerQ->front
,而不是pointerQ->front->next
,这可能是你的问题。如果你能提供一个可运行的程序并告诉你期望的输出,回答你的问题会更容易。奇怪的是,pointerQ->front
不是指针。根据我对堆栈的了解,这应该是一个指针,以便您可以更改它,如果队列为空,则将其设置为NULL
,等等。只需编辑它以提供结构代码,在回答明确标记为“C”而非“C++”的问题时不允许引用。除此之外,它看起来很好…不符合C11-所以是的,你错了。引用是C++的一个特征,从来都不是C的一部分。