链接列表的分段错误 - 仅当使用多个时

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;