Psy358 2023-06-19 00:40 采纳率: 90.9%
浏览 19

一个传递结构体指针到函数做修改的问题C语言

题目

img

img

img


不能够实现的代码  对传进来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;
}

能够实现的代码 使用两个局部变量来移动节点  用temp来指向产生一个新的链表  最后让L1 L2始终是头节点未改动,L1 L2头结点下一个指向NULL  成功影响外面的main函数里的L1 L2 这是为什么呢?为什么上一段代码不能影响到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;
}

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-06-19 10:34
    关注

    这个函数这样写,供参考:

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

报告相同问题?

问题事件

  • 创建了问题 6月19日