C 合并2个单链表(无头节点)

C 合并2个单链表(无头节点),c,merge,singly-linked-list,C,Merge,Singly Linked List,我有两个没有头部节点的单链表: 列表1:[x1->x2->………->xn] 列表2:[y1->y2->……->ym] 合并后: if(ny1->x2->y2->………->xn->yn->y(n+1)->……->ym] 否则 列表1:[x1->y1->x2->y2->………->xm->ym->x(m+1)->……->xn] 以下是我的合并功能: void merge(NODE *list1, NODE *list2) { NODE *ptr1 = list1; NODE *ptr2

我有两个没有头部节点的单链表

列表1:[x1->x2->………->xn]

列表2:[y1->y2->……->ym]

合并后:

if(n 列表1:[x1->y1->x2->y2->………->xn->yn->y(n+1)->……->ym]

否则

列表1:[x1->y1->x2->y2->………->xm->ym->x(m+1)->……->xn]

以下是我的合并功能:

void merge(NODE *list1, NODE *list2)
{
    NODE *ptr1 = list1;
    NODE *ptr2 = list2;

    while(1)
    {
        if(ptr2 == NULL)
            break;

        if(ptr1->next == NULL)
        {
            ptr1->next = ptr2;
            display(list1);

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

            break;
        }

        list2 = list2->next;

        ptr2->next = ptr1->next;
        ptr1->next = ptr2;

        ptr2 = list2;
        ptr1 = (ptr1->next)->next;

        display(list1);
    }
}
但是在主函数中执行它之后,列表2应该是空的,但它不是。

例如:

列表1:[1->2->3]

列表2:[5->6->7]

合并后:

列表1:[1->5->2->6->3->7]

列表2:[5->2->6->3->7](本应为空)

请解释

编辑:

样本输出:

----------[名单一]----------

输入元素(-123)以退出:1

[名单:1]

输入一个元素(-123)退出:2

[名单:12]

输入元素(-123以退出):-123

----------[名单二]----------

输入元素(-123以退出):5

[名单:5]

输入元素(-123以退出):6

[名单:5/6]

输入元素(-123以退出):7

[名单:567]

输入一个元素(-123)退出:8

[名单:56778]

输入元素(-123以退出):-123

[名单:1 5 2]

[名单:152678]

----------[合并名单]----------

[名单:152678]


[列表:5 2 6 7 8]

列表2没有理由为空:

列表2并不是字面上的列表,只是指向第二个列表的第一个元素的指针,在合并后成为完整列表的第二个元素

在内存中,只有一个列表
[1->5->2->6->3->7]
,指针
list1
指向它的第一个元素,
list2
指向第二个元素


因此,当您打印
list1
时,它将打印从表单1开始的列表,而当您打印
list2
时,它将打印从5开始的列表,指针是指针。他们只是指着东西。有一个指向链表中间的指针是完全有效的。这样,一个列表可以是另一个列表的子集。正如注释中所指出的,合并函数的这种行为并不奇怪

但是,如果您想这样做: 为了“使列表2为空”,您可以在通话后取消对它的引用。像这样:

merge(list1, list2);
list2 = NULL;
如果要在函数中执行此操作,可以使用指向指针的指针:

void merge(NODE **list1, NODE **list2)
{
    NODE *ptr1 = *list1;
    NODE *ptr2 = *list2;    
 // Do stuff
    if(blabla) 
        **list1 = NULL;
    else
        **list2 = NULL;
}
然后像这样调用merge:

merge(&list1, &list1)

请回答您的问题,并提供一个让您认为“列表2”应该为空的原因?但是我增加了列表2,以在每次迭代while循环时指向下一个节点,所以在上一次迭代后它不会指向NULL吗?指针按值传递给merge函数,基本上,您只获取一个副本并增加它,不影响函数范围之外的指针好的。。。知道了!谢谢你的回复,兄弟!:)谢谢你的建议!我感谢你的努力:)不。只有一个。你的回答帮助了我,但没有回答问题