无法使用指向该变量

时间:2016-01-25 11:25:49

标签: c pointers recursion linked-list

我写了一个方法将两个已排序的链表(LL按升序排列)合并为一个。通过使用双指针,我将头指针的地址从调用函数(main)传递给被调用函数(mergeSortedLL)。

//definition of listNode
    struct ListNode{
    int data;
    struct ListNode *next;
    };


void mergeSortedLL(struct ListNode **headA,struct ListNode *prevA,struct ListNode **headB,struct ListNode *prevB)
{
    struct ListNode *currA=*headA,*currB=*headB;
    static struct ListNode *finalHead=NULL;


//  Base Condition
if(!currA || !currB)
{

    *headA=finalHead;                     // this should change head in main function
      printList(*headA);                  // LINE-1  this function prints data of linked list sequentially. 
    return;
}

    struct ListNode *nextA=currA->next, *nextB=currB->next;

    if(currA->data>currB->data)
    {
        if(!finalHead)
            finalHead=currB;           // finalhead points to head of that LL which starts with smaller value node

        currB->next=currA;
        if(prevB)
            prevB->next=currB;
        mergeSortedLL(&currA,currB,&nextB,currB);
    }

    else
    {
        if(!finalHead)
            finalHead=currA;           //finalhead points to head of that LL which starts with smaller value node

        currA->next=currB;
        if(prevA)
            prevA->next=currA;
        mergeSortedLL(&nextA,currA,&currB,currA);
    }
}

在主要功能中,我创建了两个LL
头==> -1-> 3-> 5-> 6-> 8-> 9第一节点为-1
HEAD2 ==> 0→1→4-将5-&将7-> 8-> 9
在从主

打电话之后
mergeSortedLL(&head,NULL,&head2,NULL);
printList(head);                             //Line-2

我无法预测的是mergeSortedLL函数的第1行始终打印所需的已排序LL,而main中第2行的printList方法有时需要head传递,有时head2到通过获得所需的输出(0113455678899) 例如,如果第一个LL更改为head==> 1->3->5->6->8->9,(第一个节点为正1)第2行需要传递head2而不是head来获得所需的o / p。
如何通过双指针头在mergeSoretedLL方法中发生这种情况我将头部(主要功能)更改为指向finalHead。

我认为headA和headB的某些值会被交换,但我无法在这里看到它。 有人请解释一下。

1 个答案:

答案 0 :(得分:1)

您需要指定:

*headA=finalHead; 
在if和else语句中也是

。如下所示:

if(!finalHead) {  // in if case
    finalHead=currB; 
    *headA = finalHead;
}

...
...

if(!finalHead) {  // in else case
    finalHead=currA; 
    *headA = finalHead;
}

这是因为当你从main调用时,currA和CurrB不是NULL,因为* headA和* headB不是NULL。因此,如果或者基于currA->data > currB->data的语句是真的,您的代码就会输入。在这里,您将finalHead指定为currA或currB,但是,这不会反映在* headA(head in main)中。所以,显然当你从main打印时,你不会得到结果。

因此,请确保在第一个递归级别中,将headA分配给目标节点的地址。