c++ - 我得到一个断点,我不知道为什么

标签 c++ linked-list breakpoints priority-queue

我正在尝试通过使用 C++ 中的链表来实现优先级队列。但是,当我运行该程序时,它会在“priorityQLinkedList::dequeue()”方法中触发一个断点。谁能告诉我为什么会这样,并给我建议如何解决?

代码:

#include <iostream>
#include <cstring>
#include <iomanip>

using namespace std; 

struct DAT
{
    int id;
    char fullname[50];
    double savings; 
};

struct NODE
{
    DAT data; 
    NODE *N; 
    NODE *P;
    NODE(const int i, const char *f, const double s)
    {
        data.id = i;
        strcpy_s(data.fullname, f);
        data.savings = s;
        N = NULL; 
        P = NULL; 
    }
};

class priorityQLinkedList
{
private:
    NODE *front; 
    NODE *back;
public:
    priorityQLinkedList() { front = NULL; back = NULL; }
    ~priorityQLinkedList() { destroyList(); }
    void enqueue(NODE *);
    NODE* dequeue();
    void destroyList(); 
};

void priorityQLinkedList::enqueue(NODE *n)
{
    if (front == NULL) {
        front = n;
        back = n;
    }

    else {
        NODE *temp = front;
        if (n->data.id > temp->data.id)
        {
            front->P = n;
            n->N = front; 
            front = n; 
        }
        else
        {
            //search for the posistion for the new node. 
            while (n->data.id < temp->data.id)
            {
                if (temp->N == NULL) {
                    break; 
                }
                temp = temp->N; 
            }

            //New node id's smallest then all others
            if (temp->N == NULL && n->data.id < temp->data.id)
            {
                back->N = n;
                n->P = back;
                back = n; 
            }

            //New node id's is in the medium range.
            else {
                temp->P->N = n; 
                n->P = temp->P; 
                n->N = temp;
                temp->P = n; 
            }
        }
    }
}

NODE* priorityQLinkedList::dequeue()
{
    NODE *temp; 

    //no nodes
    if (back == NULL) {
        return NULL; 
    }

    //there is only one node
    else if (back->P == NULL) {
        NODE *temp2 = back; 
        temp = temp2;
        front = NULL;
        back = NULL; 
        delete temp2;
        return temp; 
    }

    //there are more than one node
    else {
        NODE *temp2 = back;
        temp = temp2; 
        back = back->P;
        back->N = NULL;
        delete temp2;
        return temp;
    }

}

void priorityQLinkedList::destroyList()
{
    while (front != NULL) {
        NODE *temp = front; 
        front = front->N;
        delete temp; 
    }
}

void disp(NODE *m) {
    if (m == NULL) {
        cout << "\nQueue is Empty!!!" << endl; 
    }
    else {
        cout << "\nID No.   : " << m->data.id; 
        cout << "\nFull Name    : " << m->data.fullname; 
        cout << "\nSalary   : " << setprecision(15) << m->data.savings << endl; 
    }
}

int main() {
    priorityQLinkedList *Queue = new priorityQLinkedList();

    NODE No1(101, "Qasim Imtiaz", 567000.0000);
    NODE No2(102, "Hamad Ahmed", 360200.0000);
    NODE No3(103, "Fahad Ahmed", 726000.0000); 
    NODE No4(104, "Usmaan Arif", 689000.0000); 

    Queue->enqueue(&No4); 
    Queue->enqueue(&No3);
    Queue->enqueue(&No1);
    Queue->enqueue(&No2); 

    disp(Queue->dequeue());
    disp(Queue->dequeue());
    disp(Queue->dequeue());
    disp(Queue->dequeue()); 
    disp(Queue->dequeue());

    delete Queue; 
    return 0; 
}

最佳答案

dequeue() 方法中突出的一个问题是您在 NODE 指针上调用 delete,然后尝试将这个删除的指针返回给调用者。这可能会导致 dequeue() 本身出错,或者肯定会导致调用者认为他正在取回指向实际事件 NODE 对象的指针。

一个潜在的修复方法是创建一个正在出列的 NODE 的拷贝。您仍然会从列表中删除目标,但随后会向调用者返回一个有效的指针,他可以稍后释放该指针。

NODE* priorityQLinkedList::dequeue()
{
    NODE *temp; 

    // no nodes
    if (back == NULL) {
        return NULL; 
    }

    NODE *temp2 = back; 
    temp = new NODE(temp2->data.id, temp2->data.fullname, temp2->data.savings);

    // there is only one node
    else if (back->P == NULL) {
        front = NULL;
        back = NULL; 
        delete temp2;
        return temp; 
    }

    // there are more than one node
    else {
        back = back->P;
        back->N = NULL;
        delete temp2;
        return temp;
    }
}

关于c++ - 我得到一个断点,我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44712920/

相关文章:

objective-c - 在 Xcode 中删除断点

c# - 多线程:防止 Visual Studio 阻塞特定线程

c++ - 加快图像中的自相似性

在 C 中创建一个链接列表,但是我创建的函数的结束条件是什么,因为它没有退出

c - 如何从链接列表中获取数据部分进行比较?

python - 我可以在 Python 的后台线程上放置断点吗?

c++ - 处理线性代数的最佳基类型

c++ - MFC 中的 OnKillFocus() 覆盖在奇数时间触发

c++ - 为什么 malloc_trim() 只适用于主场?

c - 反转C中双链表的元素