C 合并2个单链表(无头节点)
我有两个没有头部节点的单链表: 列表1:[x1->x2->………->xn] 列表2:[y1->y2->……->ym] 合并后: if(nC 合并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
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函数,基本上,您只获取一个副本并增加它,不影响函数范围之外的指针好的。。。知道了!谢谢你的回复,兄弟!:)谢谢你的建议!我感谢你的努力:)不。只有一个。你的回答帮助了我,但没有回答问题