c++ 我试图合并两个列表,但我的合并函数不能正常运行,当我调用合并函数时,程序终止了

wgxvkvu9  于 2023-04-08  发布在  其他
关注(0)|答案(2)|浏览(118)

我试着写一些伪语句来找出问题所在。问题似乎出现在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;
}
d7v8vwbk

d7v8vwbk1#

merge()内部,您正在循环list,直到p变为nullptr,因此当您在循环后尝试访问p->next时,pnullptr
你需要修复你的循环,当它到达最后一个节点时停止,而不是当它经过最后一个节点时停止,例如:

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

xqkwcwgp2#

对于初学者来说,如果你想把第二个列表list2附加到第一个列表list上,那么在调用函数merge之后,列表list2应该是空的。
在while循环后的函数merge中

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

指针p是一个空指针。所以在这个语句中使用空指针来访问内存

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

相关问题