我有2个单独链接列表没有头节点:
列表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] 这是我的合并功能: 但是在主函数中执行后,LIST 2应该是空的,但事实并非如此。 例如: 列表1:[1-> 2→ 3] 列表2:[5-> 6-> 7] 合并后: 列表1:[1-> 5→ 2→ 6-> 3→ 7] 列表2:[5-> 2→ 6-> 3→ 7](这应该是空的) 请解释一下! 修改: 示例输出: ---------- [列表1] ---------- 输入一个元素(-123退出):1 [列表:1] 输入一个元素(-123退出):2 [列表:1 2] 输入一个元素(-123退出): - 123 ---------- [清单2] ---------- 输入一个元素(-123退出):5 [列表:5] 输入一个元素(-123退出):6 [列表:5 6] 输入一个元素(-123退出):7 [列表:5 6 7] 输入一个元素(-123退出):8 [列表:5 6 7 8] 输入一个元素(-123退出): - 123 [列表:1 5 2] [列表:1 5 2 6 7 8] ---------- [合并清单] ---------- [列表:1 5 2 6 7 8] [列表:5 2 6 7 8] 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);
}
}
答案 0 :(得分:1)
List2没有理由为空:
列表2不是字面上的列表,只是指向第二个列表的第一个元素的指针,它在合并后成为完整列表的第二个元素。
在内存中,只有一个列表[1->5->2-> 6-> 3-> 7]
,指针list1
指向其第一个元素,list2
指向第二个元素。
因此,当您打印list1
时,它将从1开始打印列表,而当您打印list2
时,它将从5开始打印列表
答案 1 :(得分:0)
指针是指针。他们只是指出事情。有一个指向链表中间的指针是完全有效的。这样,一个列表可以是另一个列表的子集。正如评论中所指出的,这不是合并函数的奇怪行为。
如果你想这样做: 为了“使列表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)