我试图合并两个列表,但合并函数运行不正常.当我调用merge函数时,程序就终止了



我尝试放置伪语句来找出问题。问题似乎出现在merge()函数的末尾p->next=list2;,但我不知道问题出在哪里。

#include <iostream>
using namespace std;
int value, count, value2, count2,choice;
struct node
{
int data;
node * next;
};
node *list = nullptr;
node *list2 = nullptr;
node * p;
node * q;
node * r;
void insertFront()
{
cout << "ENTER A VALUE=";
cin >> value;
if (list == nullptr)
{
p = new node();
p->data = value;
p->next = nullptr;
list = p;
}
else
{
p = new node();
p->data = value;
p->next = list;
list = p;
}
}
void insertFront2()
{
cout << "ENTER A VALUE=";
cin >> value;
if (list2 == nullptr)
{
r = new node();
r->data = value;
r->next = nullptr;
list2 = r;
}
else
{
r = new node();
r->data = value;
r->next = list2;
list2 = r;
}
}
void delFront()
{
if (list == nullptr)
{
cout << "LIST IS ALREADY EMPTY";
}
else
{
p = list;
list = p->next;
delete(p);
}
}
void display(int choice)
{
int select=choice;
if (select == 1)
{
p = list;
}
if (select == 2)
{
p = list2;
}
while (p != nullptr)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void mergeLists(node *list,node *list2)
{
if (list==nullptr and list2==nullptr){
cout<<"Both lists are empty";
}
else if(list==nullptr && list2!=nullptr){
display(2);
}
else if(list2==nullptr && list!=nullptr){
display(1);
}
if(list!=nullptr && list2!=nullptr){
p=list;
while(p!=nullptr){
p=p->next;
}
p->next=list2;
display(1);
}
}
int main()
{
int choice;
cout << "1) Insert at front " << endl;
cout << "2) Delete at front" << endl;
cout << "7) Merge two lists" << endl;
cout << "9) Display" << endl << endl;
while (choice != 99)
{
cout << "Your choice:";
cin >> choice;
switch (choice)
{
case 1:
{
int sel;
cout << "Enter the list to which you want to enter:n 1 or 2nYour choice:";
cin >> sel;
if (sel == 1)
{
insertFront();
}
else if (sel == 2)
{
insertFront2();
}
break;
}
case 2:
{
delFront();
break;
}
case 7:
{
mergeLists(list,list2);
break;
}
case 9:
{
int sel;
cout<<"Select a list to display: 1/2"<<endl;
cin>>sel;
display(sel);
break;
}
case 99:
{
cout << "PROGRAM TERMINATED :)";
break;
}
}
}
return 0;
}

merge()中,您将循环通过list,直到p变为nullptr,因此当您尝试在循环后访问p->next时,p就是nullptr

您需要修复循环,使其在到达最后一个节点时停止,而不是在经过最后一个结点时停止,例如:

void mergeLists(node *list, node *list2)
{
if (!list && !list2){
cout << "Both lists are empty";
}
else if (!list && list2){
display(2);
}
else if (!list2 && list){
display(1);
}
else {
p = list;
while (p->next){
p = p->next;
}
p->next = list2;
display(1);
}
}

首先,如果您想将第二个列表list2附加到第一个列表list,那么在调用函数merge之后,列表list2应该为空。

在函数内合并后while循环

while(p!=nullptr){
p=p->next;
}

指针CCD_ 14是空指针。因此,在语句中使用空指针访问内存

p->next=list2;

导致未定义的行为。

这个if语句

if(list!=nullptr && list2!=nullptr){

是多余的。

使用您的方法,可以通过以下方式定义功能

void mergeLists(node *list,node *list2)
{
if ( list == nullptr and list2 == nullptr )
{
cout<<"Both lists are empty";
}
else if ( list == nullptr && list2 != nullptr )
{

list = list2;
list2 = nullptr; 
display(1);
}
else if ( list2 == nullptr && list != nullptr )
{
display(1);
}
else
{
p = list;
while ( p->next != nullptr )
{
p = p->next;
}
p->next = list2;
list2 = nullptr;
display(1);
}
}

请注意,让函数依赖于全局变量是个坏主意。例如,如果你想再使用一个列表,你需要重写你的函数。

此外,您还有太多的冗余代码,例如函数insertFrontinsertFront2中的代码。它们的定义可以简单得多。例如

void insertFront()
{
cout << "ENTER A VALUE = ";
cin >> value;
list = new node { value, list };
} 

void insertFront2()
{
cout << "ENTER A VALUE = ";
cin >> value;
list2 = new node { value, list2 };
}

相关内容

  • 没有找到相关文章

最新更新