将2个链表中包含的相同值写入另一个链表

时间:2019-06-14 16:37:47

标签: c++

我想编写一个函数来创建新的单链表,并将包含在两个其他单链表中的相同值写入其中。我写下了带有嵌套“ for”循环的解决方案,但我不明白为什么它不起作用。

struct list {
    int data;
    list *next;
};

// Adding
list* add(list* l, int x)
{
    if (l == NULL)
    {
        l = new list;
        l->data = x;
        l->next = NULL;

        return l;
    }

    list* temp = l;
    while (temp->next != NULL)
    {
        temp = temp->next;
    }

    list* p = new list;
    p->data = x;
    p->next = NULL;

    temp->next = p;

    return l;
}
// That function generates SegFault 11
list* foo(list* l1, list* l2) {
    list* new_list;

    for (list* temp1 = l1 ; temp1 != NULL; temp1 = temp1->next) {
        for (list* temp2 = l2; temp2 != NULL; temp2 = temp2->next) {
            if (temp1->data == temp2->data) {
                new_list = add(new_list, temp1->data);
            }
        }
    }

    return new_list;
}

// show() code

int main(int argc, char const *argv[]) {
    list* l;

    l = add(l, 13);
    l = add(l, 34);
    l = add(l, 13);
    l = add(l, 7);
    l = add(l, 90);

    show(l);
    cout << endl;

    list* l2;
    l2 = add(l2, 13);
    l2 = add(l2, 61);
    l2 = add(l2, 48);
    l2 = add(l2, 7);
    l2 = add(l2, 90);
    cout << endl;

    show(l2);
    cout <<  endl;

    list* l3 = foo(l, l2); // 13 7 90
    show(l3);

    return 0;
}

我预期为“ 13 7 90”。但是收到分段错误。为什么? 我用add()函数编辑了代码

2 个答案:

答案 0 :(得分:1)

您必须将所有指针值(列表*:l,l2,new_list,next)初始化为某对象。在C ++(11及更高版本)中,您将它们初始化为nullptr,在较旧的C ++和C中,您将它们初始化为NULL。如果您不这样做,它们将具有一个随机值,并且您的代码正在对其不拥有的内存进行读写操作。

注意:我假设当您将null指针传递给add()时,它将分配一个新的列表结构。

答案 1 :(得分:0)

list * l = NULL; //只需在main中将其初始化为NULL。

list * l2 = NULL; //只需在main中将其初始化为NULL。

/ *现在您的代码可以正常工作。* /