我不能组合2个单向链表

时间:2017-10-14 20:51:18

标签: c

我为单向链表的组合2工作。

那是我的节点。

  struct node
{
    int x;
    node *next;
};

那是组合器。

void combine(struct node *go1,struct node *go2)
{
    while(go1!=NULL) go1=go1->next;
    while(go2!=NULL)
    {
        go1=(node*)malloc(sizeof(node));
        go1->x=go2->x;
        go1=(node*)malloc(sizeof(node));

        go1=go1->next;
        go2=go2->next;
    }
}

这是主要功能。

main()
{
    struct node *head;
    head = (node*)malloc(sizeof(node));
    head -> x = 5;
    head -> next = (node*)malloc(sizeof(node));
    head -> next -> x = 10;
    head -> next -> next = (node*)malloc(sizeof(node));
    head -> next -> next -> x = 23;
    head -> next -> next -> next = NULL;

    struct node *head2;
    head2 = (node*)malloc(sizeof(node));
    head2 -> x = 5;
    head2 -> next = (node*)malloc(sizeof(node));
    head2 -> next -> x = 13;
    head2 -> next -> next = (node*)malloc(sizeof(node));
    head2 -> next -> next -> x = 31;
    head2 -> next -> next -> next = NULL;
    print(head);

    combine(head,head2);
    print(head);

            execute(head);

}

打印功能是自定义打印列表功能。我做的很简单,执行是免费的()列表。打印头,打印仅5,10,23和5,10,23。不包括head2的x值。我想追加head2&x; s xp的head1。

1 个答案:

答案 0 :(得分:1)

此循环后

while(go1!=NULL) go1=go1->next;

指针go1等于NULL,前一个节点的数据成员next也等于NULL。如果您更改指针go1,前一节点的数据成员next将不会更改,因为它们是不同的对象占用不同的内存范围。

此外,通常第一个列表可以为空,因此最初参数go1可以等于NULL并且更改此参数不会更改原始列表,因为该函数处理原始列表的值的副本

也是第二次内存分配

    go1=(node*)malloc(sizeof(node));
    go1->x=go2->x;
    go1=(node*)malloc(sizeof(node));

没有意义。它会覆盖go1的先前值。结果是内存泄漏。

该功能可以按以下方式编写

void combine( struct node **go1, struct node **go2 )
{
    while ( *go1 != NULL ) go1 = &( *go1 )->next;

    for ( ; *go2 != NULL; go1 = &( *go1 )->next, go2 = &( *go2 )->next )
    {
        *go1 = ( node* )malloc( sizeof( node ) );
        ( *go1 )->x = ( *go2 )->x;
        ( *go1 )->next = NULL;
    }
}

该功能可以像

一样调用
combine( &head, &head2);

当然,没有必要将第二个参数声明为类型struct node **。将其声明为struct node *就足够了。但是在这种情况下,参数将具有不同的类型,可能会使功能的用户感到困惑。