生成二叉树有关问题

生成二叉树问题
#include <stdio.h>
#include <stdlib.h>

struct   TreeNode
{
    char   data;
    TreeNode*lchild;
    TreeNode*Rchild;
};


void   ProCreate(TreeNode*p)//先序遍历生成二叉树
{
    char   a;
    printf( "请输入字符: ");
    scanf( "%c ",&a);
    getchar();
    if   (a== '! ')   p=NULL;
    else  
    {
    p=(TreeNode*)malloc(sizeof(TreeNode));
    p-> data=a;
    ProCreate(p-> lchild);
    ProCreate(p-> Rchild);
   
   
    }
 
    return;
}

void   ProVist(TreeNode*p)//先序遍历
{
       
if   (p!=NULL)
    {
        printf( "%c\n ",p-> data);
   
        ProVist(p-> lchild);
ProVist(p-> Rchild);
    }
    return;


}


main(void)
{
    TreeNode   *p=NULL;
    ProCreate(p);
    ProVist(p);

}

这段程序有问题,但是在不知道错在哪里,请各位大哥帮帮忙看看,感激不禁

------解决方案--------------------
#include <stdio.h>
#include <stdlib.h>

struct TreeNode
{
char data;
struct TreeNode* lchild;
struct TreeNode* Rchild;
};


void ProCreate(struct TreeNode **p)//先序遍历生成二叉树
{
char a;
printf( "请输入字符: ");
scanf( "%c ",&a);
getchar();
if (a== '! ') *p=NULL;
else
{
(*p)=(struct TreeNode*)malloc(sizeof(struct TreeNode));
(*p)-> data=a;
ProCreate(&(*p)-> lchild);
ProCreate(&(*p)-> Rchild);
}
return;
}

void ProVist(struct TreeNode *p)//先序遍历
{
if (p!=NULL)
{
printf( "%c\n ",p-> data);

ProVist(p-> lchild);
ProVist(p-> Rchild);
}
return;
}

int main()
{
struct TreeNode *p=NULL;
ProCreate(&p);
ProVist(p);
system( "PAUSE ");
return 0;
}