从 pop 函数返回错误的地址 [英] returning wrong address from pop function

查看:19
本文介绍了从 pop 函数返回错误的地址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

After solving other issues with my struct, my push works as intended however my pop returns the wrong address and I'm not sure why -

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;
}

我相当确定我实际删除和重新链接堆栈的逻辑是正确的,但我对指针的使用和返回它们是一团糟.

I'm fairly certain my logic for the actual removal and relinking of the stack is correct but my use of pointers and returning them is messed up.

结构 -

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,它是最后一个元素,因为没有下一个.使用它非常简单.

You shouldn't be using "sentinel nodes"; this is pointless and very confusing. A queue can be simply represented as a QNode* to the first element. It always points to the first element; if it's NULL, the queue is empty; if element->next is NULL, it's the last element because there isn't a next one. It's very simple to work with that.

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

我没有测试它,但它给出了一个大致的想法.

I didn't test it, but it gives a general idea.

您可以使用 push_front()create_node_front() 推送(无循环,最佳性能)然后使用 pop_end() 弹出队列效果(FIFO),或使用 pop_front() 弹出具有堆栈效应(LIFO).

You can push with push_front() or create_node_front() (no loops, best performance) then pop with pop_end() to have a queue effect (FIFO), or pop with pop_front() to have a stack effect (LIFO).

这篇关于从 pop 函数返回错误的地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆