我得到了一个断点,我不知道为什么 我尝试用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;
}