我想编写一个函数来创建新的单链表,并将包含在两个其他单链表中的相同值写入其中。我写下了带有嵌套“ 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()函数编辑了代码
答案 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。
/ *现在您的代码可以正常工作。* /