如何将链接列表插入另一个链表中?

问题描述:

我想编写一个函数,可以让我在某个位置插入一个链表到另一个链表这样如果链表是:如何将链接列表插入另一个链表中?

list1: [1]->[2]->[3]->NULL 
list2: [4]->[5]->[6]->NULL 

然后调用该函数:

insertList(list1, list2, 1); 

修改list1,使得:

list1 = [1]->[4]->[5]->[6]->[2]->[3]->NULL 

和list2保持未修改和可用。

这里是结构定义:

struct _node { 
    int item; 
    struct _node *next; 
} 


struct _list { 
    struct _node *head; 
    struct _node *last; 
} 

这里是我的尝试,因为我得到赛格故障不工作。

void insertList(struct _list *list1, struct _list *list2, int pos) { 
    assert(list != NULL && list2 != NULL); 

    int currPos = 0; 
    struct _node *curr = list1->head; 

    if (pos < 0 || pos >= numLines(list1)) { 
     abort(); 
    } 

    // traverse linked list to get to correct position 
    while (curr != NULL && currPos != pos) { 
     curr = curr->next; 
     currPos++; 
    } 

    struct _node *temp = curr->next; 
    curr->next = list2->head; 

    while (curr != NULL) { 
     curr = curr->next; 
    } 

    curr->next = temp; 

    // updating last 
    curr = list1->head; 
    while (curr != NULL) { 
     curr = curr->next; 
    } 
    list1->last = curr; 
} 
+1

我很困惑。每个“头”都指向同一个节点,还是会有不同的头?你是否更新'list2'的每个'head',因为它现在是'list1'的一部分,因为你只是复制指针而不是数据?哪里是更新'list1'和'list2'的'tail'指针的代码? –

+0

我以为我必须保持list2不变,所以它的指针保持不变,因为它必须在函数调用后保持可用。 – user6005857

+0

您的'node'结构将两个东西 - 列表中的节点('item'和'next')以及列表的总体开始和结束('head'和'last')混合在一起。为保持一致性,每次添加或删除列表头部或尾部的项目时,都必须遍历整个列表以更新“head”和“last”指针。当您将一个列表插入另一个列表时,必须更新插入列表中的所有指针,以指向它所插入列表的头部和尾部。等分开两组数据。 –

while (curr != NULL) { 
    curr = curr->next; 
} 

- >在这个位置currNULL,然后你做

curr->next = temp; //NULL->next gives you seg fault. 

你可能想

while (curr->next != NULL){ 
... 
} 

你也将不得不改变的最后一部分

while (curr != NULL) { 
    curr = curr->next; 
} 
list1->last = curr; //here also curr is NULL, you need to rull the loop 
        //till curr->next!=NULL 
+0

谢谢,但我在进行这些更改后仍然遇到seg故障。 – user6005857

+0

对于哪些输入,你会得到seg故障?与问题中提到的一样? –

+0

示例中的相同输入。 – user6005857