感谢你的回复,真的很牛,不过这二级指针我越看越迷糊,我也free不了内存空间,我只能对Merge函数内容做出修改,参数也不能更改。main函数也不能动。我把你的代码copy过去测试了,我把测试结果发出来。
你的第一次回复 Merge函数代码 测试:List Merge(List L1, List L2) {
List L = malloc(sizeof(*L));
L->Next = NULL;
List *px = &L->Next;
List p1 = L1->Next;
while(p1) {
*px = malloc(sizeof(**px));
(*px)->Data = p1->Data;
(*px)->Next = NULL;
p1 = p1->Next;
px = &(*px)->Next;
}
List p2 = L2->Next;
while(p2) {
*px = malloc(sizeof(**px));
(*px)->Data = p2->Data;
(*px)->Next = NULL;
p2 = p2->Next;
px = &(*px)->Next;
}
return L;
}
你的第二次回复 Merge函数代码 测试:List Merge(List L1, List L2) {
List L = malloc(sizeof(*L));
L->Next = NULL;
List *px = &L->Next;
List p1 = L1->Next;
List p2 = L2->Next;
while(p1 && p2) {
ElementType v;
ElementType a = p1->Data;
ElementType b = p2->Data;
if(a < b) {
v = a; p1 = p1->Next;
} else {
v = b; p2 = p2->Next;
}
*px = malloc(sizeof(**px));
(*px)->Data = v;
(*px)->Next = NULL;
px = &(*px)->Next;
}
while(p1) {
*px = malloc(sizeof(**px));
(*px)->Data = p1->Data;
(*px)->Next = NULL;
p1 = p1->Next;
px = &(*px)->Next;
}
while(p2) {
*px = malloc(sizeof(**px));
(*px)->Data = p2->Data;
(*px)->Next = NULL;
p2 = p2->Next;
px = &(*px)->Next;
}
return L;
}
也许大佬你没有仔细看题 实现这个题目最后L1 L2指向的下一个节点是NULL 由于我的代码是通过传递进去的L1 L2指针来进行改动移动节点 导致回到主函数中去的时候好像没有改动到L1 L2节点位置 还依然是头节点 我看过一些题解是用两个局部变量的指针指向L1 L2 再来做这两个局部变量的指针移动节点 最后把L1 L2指向的下一个节点为NULL 有这样一段代码实现 我不明白的是 为什么用完局部变量的节点之后 最后L1->Next = NULL和L2->Next = NULL 是能够影响到外面main函数的L1 L2。而直接对L1 L2修改 直到L1 L2都为NULL时返回到main函数,main函数里的L1 L2依然为最开始头节点。
能够实现的代码 使用两个局部变量来移动节点 用temp来指向产生一个新的链表 最后让始终是L1 L2头结点下一个指向NULL 成功影响外面的main函数里的L1 L2:List Merge( List L1, List L2 )
{
List head,temp,TL1,TL2;
head = temp = (List)malloc(sizeof(struct Node));
TL1 = L1->Next;
TL2 = L2->Next;
while(TL1 && TL2)
{
if(TL1->Data <= TL2->Data)
{
temp->Next = TL1;
TL1 = TL1->Next;
}
else
{
temp->Next = TL2;
TL2 = TL2->Next;
}
temp = temp->Next;
}
if(TL1)
{
while(TL1)
{
temp->Next = TL1;
TL1 = TL1->Next;
temp = temp->Next;
}
temp->Next = NULL;
}
else if(TL2)
{
while(TL2)
{
temp->Next = TL2;
TL2 = TL2->Next;
temp = temp->Next;
}
temp->Next = NULL;
}
else
temp->Next = NULL;
L1->Next = NULL;
L2->Next = NULL;
return head;
}
不能够实现的代码 对传进来L1 L2结构体指针操作 能够实现让两个链表合并成一个递增的顺序链表 但是L1 L2在Merge函数结束时为NULL 回到main函数却变成了最开始L1 L2的头指针:List Merge( List L1, List L2 )
{
List head,temp;
head = temp = (List)malloc(sizeof(struct Node));
L1 = L1->Next;
L2 = L2->Next;
while(L1 && L2)
{
if(L1->Data <= L2->Data)
{
temp->Next = L1;
L1 = L1->Next;
}
else
{
temp->Next = L2;
L2 = L2->Next;
}
temp = temp->Next;
}
if(L1)
{
while(L1)
{
temp->Next = L1;
L1 = L1->Next;
temp = temp->Next;
}
temp->Next = NULL;
}
else if(L2)
{
while(L2)
{
temp->Next = L2;
L2 = L2->Next;
temp = temp->Next;
}
temp->Next = NULL;
}
else
temp->Next = NULL;
//到这里L1 L2为NULL 运行到后面在main函数里打印出L1 L2为原始头节点。。
return head;
}
|