我得到了一个断点,我不知道为什么 我尝试用C++中的链表实现优先级队列。但是,当我运行该程序时,它会在“priorityQLinkedList::dequeue()”方法中触发一个断点。有人能告诉我为什么会这样,并给我建议如何解决它吗

我得到了一个断点,我不知道为什么 我尝试用C++中的链表实现优先级队列。但是,当我运行该程序时,它会在“priorityQLinkedList::dequeue()”方法中触发一个断点。有人能告诉我为什么会这样,并给我建议如何解决它吗,c++,linked-list,breakpoints,priority-queue,C++,Linked List,Breakpoints,Priority Queue,代码: #包括 #包括 #包括 使用名称空间std; 结构数据 { int-id; 字符全名[50]; 双重储蓄; }; 结构节点 { DAT数据; 节点*N; 节点*P; 节点(常量int i、常量char*f、常量double s) { data.id=i; strcpy_s(data.fullname,f); data.savings=s; N=零; P=零; } }; 类优先级QlinkedList { 私人: 节点*前端; 节点*返回; 公众: priorityQLinkedList(

代码:

#包括
#包括
#包括
使用名称空间std;
结构数据
{
int-id;
字符全名[50];
双重储蓄;
};
结构节点
{
DAT数据;
节点*N;
节点*P;
节点(常量int i、常量char*f、常量double s)
{
data.id=i;
strcpy_s(data.fullname,f);
data.savings=s;
N=零;
P=零;
}
};
类优先级QlinkedList
{
私人:
节点*前端;
节点*返回;
公众:
priorityQLinkedList(){front=NULL;back=NULL;}
~priorityQLinkedList(){destroyList();}
无效排队(节点*);
节点*dequeue();
作废销毁清单();
};
void priorityQLinkedList::排队(节点*n)
{
if(front==NULL){
前=n;
back=n;
}
否则{
节点*温度=前部;
如果(n->data.id>temp->data.id)
{
前->P=n;
n->n=前方;
前=n;
}
其他的
{
//搜索新节点的位置列表。
而(n->data.iddata.id)
{
如果(临时->N==NULL){
打破
}
温度=温度->N;
}
//新节点id比所有其他节点id最小
如果(temp->N==NULL&&N->data.iddata.id)
{
后退->N=N;
n->P=返回;
back=n;
}
//新节点id在中等范围内。
否则{
温度->压力->N=N;
n->P=温度->P;
n->n=温度;
温度->P=n;
}
}
}
}
NODE*priorityQLinkedList::dequeue()
{
节点*温度;
//无节点
if(back==NULL){
返回NULL;
}
//只有一个节点
else if(返回->P==NULL){
节点*temp2=返回;
temp=temp2;
front=NULL;
back=NULL;
删除temp2;
返回温度;
}
//有多个节点
否则{
节点*temp2=返回;
temp=temp2;
后退=后退->前进;
后退->N=NULL;
删除temp2;
返回温度;
}
}
void priorityQLinkedList::destroyList()
{
while(前面!=NULL){
节点*温度=前部;
前=前->N;
删除临时文件;
}
}
无效显示(节点*m){
如果(m==NULL){
无法退出队列();
disp(Queue->dequeue());
disp(Queue->dequeue());
删除队列;
返回0;
}

dequeue()
方法中突出的一个问题是,您在
节点上调用
delete
指针,然后试图将此删除的指针返回给调用者。这可能会在
dequeue()中导致错误
本身,或者肯定是在调用方中,该调用方认为自己正在获取指向实际活动
节点的指针

一种可能的修复方法是创建要退出队列的
节点的副本。您仍然可以从列表中删除目标,但调用方随后将返回一个有效指针,他可以稍后释放该指针

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

dequeue()
方法中突出的一个问题是,您在
节点上调用
delete
指针,然后试图将此删除的指针返回给调用者。这可能导致
dequeue()中出现错误
本身,或者肯定是在调用方中,该调用方认为自己正在获取指向实际活动
节点的指针

一种可能的修复方法是创建要退出队列的
节点的副本。您仍然可以从列表中删除目标,但调用方随后将返回一个有效指针,他可以稍后释放该指针

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

您正在删除
dequeue
priorityQLinkedList
不拥有的指针,因此不知道删除它们是否安全

在这种情况下,它们并非如此,因为传递到
enqueue
的节点指针是本地、基于堆栈的变量的地址,并且没有被
new
分配(还有前面提到的删除指针然后返回它的问题,这是未定义的行为)


如图所示,代码的修复方法是删除
dequeue
中对
delete
的调用。但是,如果进行了更改,以便动态分配传递给
enqueue
的节点,则需要添加一些内容来处理该问题。

您正在删除
dequeue
priorityQLinkedList
的指针oes不是自己的,所以您不知道删除它们是否安全

在这种情况下,它们并非如此,因为传递到
enqueue
的节点指针是本地、基于堆栈的变量的地址,并且没有被
new
分配(还有前面提到的删除指针然后返回它的问题,这是未定义的行为)


如图所示,代码的修复方法是删除
dequeue
中对
delete
的调用。但是,如果进行了更改,以便动态分配传递给
enqueue
的节点,则需要添加一些内容来处理该问题。

1.首先将strcpy更改为strcpy is struct NODE

2.使用temp2--,而不是Delete(temp2)


我希望这能解决问题。

1.首先将strcpy更改为strcpy is struct NODE

2.使用temp2--,而不是Delete(temp2)


我希望这能解决问题。

如果我弄错了,请纠正我的错误,但是如果您
删除
要退出队列的节点,然后返回指向该节点的指针,这难道不会给调用方带来问题,然后调用方将返回一个“死”节点吗
//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;
    temp2--;
    return temp;
}

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