C++ 在c+中合并两个排序链表时出现分段错误+;
我正在解决以下问题 您将获得指向两个已排序链表的头节点的指针。两个列表中的数据将按升序排序。更改下一个指针以获得一个合并的链表,该链表也包含升序数据。给定的任何一个头指针都可能为空,这意味着对应的列表为空。 当我运行代码时,它会给我分段错误。这里p和q对应于头指针C++ 在c+中合并两个排序链表时出现分段错误+;,c++,C++,我正在解决以下问题 您将获得指向两个已排序链表的头节点的指针。两个列表中的数据将按升序排序。更改下一个指针以获得一个合并的链表,该链表也包含升序数据。给定的任何一个头指针都可能为空,这意味着对应的列表为空。 当我运行代码时,它会给我分段错误。这里p和q对应于头指针 SinglyLinkedListNode* mergeLists(SinglyLinkedListNode* p, SinglyLinkedListNode* q) { SinglyLinkedListNode *s=NUL
SinglyLinkedListNode* mergeLists(SinglyLinkedListNode* p, SinglyLinkedListNode* q) {
SinglyLinkedListNode *s=NULL;
SinglyLinkedListNode *newhead;
if(p==NULL)
{
return q;
}
else if(q==NULL)
{
return p;
}
if(p!=NULL && q!=NULL)
{
if(p->data<=q->data)
{
s=p;
p=s->next;
}
else if(q->data>=p->data)
{
s=q;
q=s->next;
}
}
newhead = s;
while(p || q)
{
if(p->data<=q->data)
{
s->next = p;
s = p;
p = s->next;
}
else if(q->data<=p->data)
{
s->next = q;
s = q;
q = s->next;
}
}
if(p==NULL)
{
s->next = p;
}
else if(q==NULL)
{
s->next = q;
}
return newhead;
}
SinglyLinkedListNode*合并列表(SinglyLinkedListNode*p,SinglyLinkedListNode*q){
SinglyLinkedListNode*s=NULL;
SingleLinkedListNode*新头;
if(p==NULL)
{
返回q;
}
else if(q==NULL)
{
返回p;
}
如果(p!=NULL&&q!=NULL)
{
if(p->datadata)
{
s=p;
p=s->next;
}
否则如果(q->数据>=p->数据)
{
s=q;
q=s->next;
}
}
newhead=s;
while(p | | q)
{
if(p->datadata)
{
s->next=p;
s=p;
p=s->next;
}
else if(q->datadata)
{
s->next=q;
s=q;
q=s->next;
}
}
if(p==NULL)
{
s->next=p;
}
else if(q==NULL)
{
s->next=q;
}
返回newhead;
}
您在(p | | q)时检查,然后在p
和q
上使用->数据。如果其中一个为空,则为UB这三条语句看起来也不正确s->next=p;s=p;p=s->next
将s->next
设置为p
,然后将p
设置为s->next
。最终的结果是,p
不会改变,而(p | q)
——问问自己,如果p
和q
的长度不同,会发生什么?我建议您在编写任何代码之前在纸上画出要做的事情,因为您所展示的代码并没有考虑到明显的情况。指针很复杂,很容易编写看起来不错的代码,但事实上并非如此。在你熟悉之前,画出你想做的事情的图表真的很有帮助。@cigien已经指出了代码的一个主要问题,只是在这里加了一个挑剔的地方:在你检查了NULL
的参数之后,第三个检查有点多余:如果(p!=NULL&&q!=NULL)
,您已经确保了NULL和都不为空
您在(p | | q)
时检查,然后在p
和q
上使用->data
。如果其中一个为空,则为UB这三条语句看起来也不正确s->next=p;s=p;p=s->next
将s->next
设置为p
,然后将p
设置为s->next
。最终的结果是,p
不会改变,而(p | q)
——问问自己,如果p
和q
的长度不同,会发生什么?我建议您在编写任何代码之前在纸上画出要做的事情,因为您所展示的代码并没有考虑到明显的情况。指针很复杂,很容易编写看起来不错的代码,但事实上并非如此。在你熟悉之前,画出你想做的事情的图表真的很有帮助。@cigien已经指出了代码的一个主要问题,只是在这里加了一个挑剔的地方:在你检查了NULL
的参数之后,第三个检查有点多余:如果(p!=NULL&&q!=NULL)
,您已经确保两者都不是空的