请问关于指针做函数形参的有关问题-小妹儿

请教关于指针做函数形参的问题---小妹儿
To All:
 背景实现链表逆序。
下面是代码
C/C++ code

struct Node 
{
    int data;
    Node *pnext;
};
// 创建链表 
bool Creatlist(Node *head)
{
    if(NULL == head)
    {
        cout<<"error"<<endl;
        return 0;
    } else {
        int num = 0;
        int count = 0;
        cin>>num;
        while(999 != num) //输入 999 结束
        {
             count++;
             if(count == 1)
             {
                 head->data = num;
             } else {
                 Node *p = new Node();
                 p->pnext = NULL;
                 p->data = num;
                 Node *temp = head;
                 while(NULL != temp->pnext)
                 {
                     temp = temp->pnext;
                 }
                 temp->pnext = p;
                 
             }
             cin>>num;
        }
        return 1;
    }
}


C/C++ code

//逆序
bool BackTrace(Node *head)
{
    if(NULL == head)
    {
        cout<<"error"<<endl;
        return 0;
    } else{
        int num = 0;
        Node *p = head;
        if(NULL == p->pnext)
        {
           return 1;
         }else{
             Node *q = head->pnext;
         Node *r = NULL;
         while(NULL != q)
         {
                 r = q->pnext;
                 if(0 == num)
                 {
                 p->pnext = NULL;
                 num++;
             }
                 q->pnext = p;
                     p = q;
             q = r;
                 }
                 head = p;//<-打断点发现实现了逆序,但是在执行return后 head的值就出错了。
         return 1;
        }
        
    }
}



C/C++ code

主函数
int _tmain(int argc, _TCHAR* argv[])
{
        Node *head = new Node();
    head->pnext = NULL;
        Creatlist(head);
    BackTrace(head);//--->可能是这里传值出错?但我不知道为什么?请大家解释下。。。谢谢。。
}



------解决方案--------------------
C/C++ code


主函数
int _tmain(int argc, _TCHAR* argv[])
{
        Node *head = new Node();
    head->pnext = NULL;
        Creatlist(head); //改成 Creatlist(&head),函数做相应修改
    BackTrace(head);--->可能是这里传值出错?但我不知道为什么?请大家解释下。。。谢谢。。
}

------解决方案--------------------
因为BackTrace函数是要改变head的值,但是参数的值在函数退出后是无效的,因此你只能用指针实现,
head是Node*,所以BackTrace的参数应该用Node**;
调用是用
BackTrack(&head);
函数里的相应改一下就好
------解决方案--------------------
逆序链表

typedef struct tagLinkNode
{
int NodeData;
tagLinkNode * NextLineNode;
} LinkNode ;

void ReverseLink(LinkNode * & headPointer)
{
LinkNode * firstOfThreeNode;
LinkNode * secondOfThreeNode;
LinkNode * thirdOfThreeNode;

if (headPointer == NULL)
{
return;
}

firstOfThreeNode = headPointer;

if (firstOfThreeNode->NextLineNode == NULL)
{
return;
}

secondOfThreeNode = firstOfThreeNode->NextLineNode;

thirdOfThreeNode = secondOfThreeNode->NextLineNode;

while (thirdOfThreeNode != NULL)
{
secondOfThreeNode->NextLineNode = firstOfThreeNode;
firstOfThreeNode = secondOfThreeNode;
secondOfThreeNode = thirdOfThreeNode;
thirdOfThreeNode = thirdOfThreeNode->NextLineNode;
}

secondOfThreeNode->NextLineNode = firstOfThreeNode;

headPointer->NextLineNode = NULL;

headPointer = secondOfThreeNode;