链接列表的分段错误 - 仅当使用多个时
Segmentation Fault with Linked List - only when using more than one
所以我写了一个函数来将元素插入到链表的末尾,它按预期工作了。大概我是这么想的,直到我尝试对另一个列表使用相同的函数,这产生了分段错误,我不明白为什么。如果这不是最好的插入方式,请原谅我,我还在学习中。
实施:
struct Node
{
int data;
struct Node* next;
};
typedef struct Node LL;
LL *makeNode(int data)
{
LL *res = malloc(sizeof(LL));
res->data = data;
res->next = NULL;
return res;
}
LL *insert(LL *head, int item)
{
if(!head)
return makeNode(item);
else if(!head->next)
{
head->next = makeNode(item);
}
else
{
LL *tmp = head;
while(tmp->next)
tmp = tmp->next;
tmp->next = makeNode(item);
}
return head;
}
void display(LL *head)
{
if(!head)
{
printf("\n");
return;
}
printf("%d, ", head->data);
display(head->next);
}
下面是我在主函数中调用它的方式:
int main()
{
srand(time(0));
LL *head1, *head2;
int i, n1 = 10, n2 = 10, item;
for(i=0; i<n1; i++)
{
item = rand()%10;
head1 = insert(head1, rand()%10);
}
for(i=0; i<n2; i++)
{
item = rand()%10;
head2 = insert(head2, rand()%10);
}
display(head1);
printf("2: ");
display(head2);
}
当我单独测试 LL head1 或 LL head2 时,以上代码提供了预期的输出。但是同时执行这两项操作会导致臭名昭著的分段错误,我不确定为什么。任何帮助将不胜感激,提前致谢。
如果头节点不存在,您的 insert()
函数会创建头节点。当您将 NULL 指针作为第一个参数传递给 insert() 时,就会发生这种情况。在您的主函数中,head1 和 head2 指针都是自动变量,因此在您第一次调用 insert() 时它们将是未定义的。您应该将他们的声明更改为:
LL *head1 = NULL;
LL *head2 = NULL;
所以我写了一个函数来将元素插入到链表的末尾,它按预期工作了。大概我是这么想的,直到我尝试对另一个列表使用相同的函数,这产生了分段错误,我不明白为什么。如果这不是最好的插入方式,请原谅我,我还在学习中。
实施:
struct Node
{
int data;
struct Node* next;
};
typedef struct Node LL;
LL *makeNode(int data)
{
LL *res = malloc(sizeof(LL));
res->data = data;
res->next = NULL;
return res;
}
LL *insert(LL *head, int item)
{
if(!head)
return makeNode(item);
else if(!head->next)
{
head->next = makeNode(item);
}
else
{
LL *tmp = head;
while(tmp->next)
tmp = tmp->next;
tmp->next = makeNode(item);
}
return head;
}
void display(LL *head)
{
if(!head)
{
printf("\n");
return;
}
printf("%d, ", head->data);
display(head->next);
}
下面是我在主函数中调用它的方式:
int main()
{
srand(time(0));
LL *head1, *head2;
int i, n1 = 10, n2 = 10, item;
for(i=0; i<n1; i++)
{
item = rand()%10;
head1 = insert(head1, rand()%10);
}
for(i=0; i<n2; i++)
{
item = rand()%10;
head2 = insert(head2, rand()%10);
}
display(head1);
printf("2: ");
display(head2);
}
当我单独测试 LL head1 或 LL head2 时,以上代码提供了预期的输出。但是同时执行这两项操作会导致臭名昭著的分段错误,我不确定为什么。任何帮助将不胜感激,提前致谢。
如果头节点不存在,您的 insert()
函数会创建头节点。当您将 NULL 指针作为第一个参数传递给 insert() 时,就会发生这种情况。在您的主函数中,head1 和 head2 指针都是自动变量,因此在您第一次调用 insert() 时它们将是未定义的。您应该将他们的声明更改为:
LL *head1 = NULL;
LL *head2 = NULL;