我试着写一些伪语句来找出问题所在。问题似乎出现在merge()
函数的末尾,但我不知道问题出在哪里。
#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 2\nYour 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;
}
2条答案
按热度按时间d7v8vwbk1#
在
merge()
内部,您正在循环list
,直到p
变为nullptr
,因此当您在循环后尝试访问p->next
时,p
是nullptr
。你需要修复你的循环,当它到达最后一个节点时停止,而不是当它经过最后一个节点时停止,例如:
xqkwcwgp2#
对于初学者来说,如果你想把第二个列表
list2
附加到第一个列表list
上,那么在调用函数merge
之后,列表list2
应该是空的。在while循环后的函数merge中
指针
p
是一个空指针。所以在这个语句中使用空指针来访问内存导致未定义的行为。
这个if语句
是多余的。
使用您的方法,可以按以下方式定义函数
注意,让函数依赖于全局变量是一个坏主意。例如,如果你想多用一个列表,你就需要重写你的函数。
另外,你有太多的冗余代码,例如在函数
insertFront
和insertFront2
中。和