gpt4 book ai didi

c - 从 pop 函数返回错误的地址

转载 作者:太空宇宙 更新时间:2023-11-04 08:52:22 25 4
gpt4 key购买 nike

在解决了我的结构的其他问题后,我的推送按预期工作,但是我的 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() 弹出队列效果(FIFO),或使用 pop_front() 弹出以产生堆栈效果(LIFO)。

关于c - 从 pop 函数返回错误的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19193418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com