tracefiow 2020-03-15 19:47 采纳率: 0%
浏览 229

对俩个链表进行合并用指针p1和p2可以,对L1,L2进行取值为什么不对?

链表中指针的问题 ,新定义指针对链表操作与直接对链表操作区别,代码如下?

代码1
List Merge( List L1, List L2 )
{
List L,q;
L =malloc(sizeof(struct Node));
q =L;
L1=L1->Next;
L2=L2->Next;
while(L1&&L2)
{
if(L1->Data<L2->Data)
{
q->Next=L1;
q =L1;
L1=L1->Next;
}
else
{

q->Next=L2;
q =L2;
L2=L2->Next;

}
}
q->Next =L1?L1:L2;
L1->Next=NULL;
L2->Next=NULL;
return L;

}
代码2

List Merge( List L1, List L2 )
{

List L;
L=malloc(sizeof(struct Node));
List p;//用P做游标遍历链表
p=L;
List p1=L1->Next;//头插法
List p2=L2->Next;
while(p1&&p2)
{
if(p1->Data<p2->Data)
{
p->Next=p1;
p=p1;
p1=p1->Next;
}
else
{
p->Next=p2;
p=p2;
p2=p2->Next;
}
}
p->Next=p1?p1:p2;
L1->Next=NULL;//为了输出
L2->Next=NULL;
return L;

}//代码2用p1和p代替L1和L2,代码直接对L1,L2为什么不对
  • 写回答

1条回答 默认 最新

  • 芣苢的成长之路 2023-06-27 01:31
    关注

    代码1中,L1和L2在函数的参数中传入,因此在函数内部对L1和L2的修改不会影响到原始链表。L1 = L1->Next 和 L2 = L2->Next 实际上是将L1和L2向后移动一个位置,而不是修改原始链表的指针。

    
    List Merge(List L1, List L2)
    {
        List L, q;
        L = malloc(sizeof(struct Node));
        q = L;
        L1 = L1->Next;
        L2 = L2->Next;
        while (L1 && L2)
        {
            if (L1->Data < L2->Data)
            {
                q->Next = L1;
                q = L1;
                L1 = L1->Next;
            }
            else
            {
                q->Next = L2;
                q = L2;
                L2 = L2->Next;
            }
        }
        q->Next = L1 ? L1 : L2;
        L1->Next = NULL;
        L2->Next = NULL;
        return L;
    }
    
    

    代码2中,同样的道理,对p1和p2的修改只会在函数内部生效,不会对原始链表产生影响。L1->Next = NULL 和 L2->Next = NULL 是为了将原始链表的指针置为空,以便输出链表时能够正确地终止。

    
    List Merge(List L1, List L2)
    {
        List L;
        L = malloc(sizeof(struct Node));
        List p; // 用P做游标遍历链表
        p = L;
        List p1 = L1->Next; // 头插法
        List p2 = L2->Next;
        while (p1 && p2)
        {
            if (p1->Data < p2->Data)
            {
                p->Next = p1;
                p = p1;
                p1 = p1->Next;
            }
            else
            {
                p->Next = p2;
                p = p2;
                p2 = p2->Next;
            }
        }
        p->Next = p1 ? p1 : p2;
        L1->Next = NULL; // 为了输出
        L2->Next = NULL;
        return L;
    }
    
    

    总结:
    无论是代码1还是代码2,它们都是通过移动指针来操作链表的,而不是直接对原始链表进行修改。这样做是为了保持链表的完整性,并确保函数能够正确返回合并后的链表。

    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题