建二叉树 前序遍历打印出现问题 “读取访问权限冲突。 p 是 nullptr。”

问题图片

img

源代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef char BiElemType;
typedef struct BiTNode
{
BiElemType c;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode, * BiTree;

typedef struct tag
{
BiTree p;
struct tag* pnext;
}tag_t, * ptag_t;

void preOrder(BiTree p)
{
if (NULL != p)
{
putchar(p->c);
}
preOrder(p->lchild);
preOrder(p->rchild);
}

int main()
{
char c;
BiTree tree=NULL;
BiTree pnew;
ptag_t ptail = NULL, phead = NULL, Listpnew=NULL, pcur = NULL;//出现不能从 int 转到 tag 原因没有给ptag_t加指针

while (scanf("%c", &c) != EOF)
{
    if (c == '\n')
    {
        break;
    }
    pnew = (BiTree)calloc(1, sizeof(BiTNode));
    pnew->c = c;
    Listpnew = (ptag_t)calloc(1, sizeof(tag_t));
    Listpnew->p = pnew;
    if (tree == NULL)
    {
        tree = pnew;
        ptail = Listpnew;
        phead = Listpnew;
        pcur = Listpnew;
        continue;
    }
    else {
        ptail->pnext = Listpnew;
        ptail = Listpnew;
    }
    if (pcur->p->lchild==NULL)
    {
        pcur->p->lchild = pnew;
    }
    else if (pcur->p->rchild == NULL)
    {
        pcur->p->rchild = pnew;
        pcur = pcur->pnext;
    }

    

}



printf("------前序遍历------\n");
preOrder(tree);

}

以解决 把
preOrder(p->lchild);
preOrder(p->rchild);
放在 putchar(p->c); 里面就好了

意思就是p出现空指针现象了
pnew = (BiTree)calloc(1, sizeof(BiTNode));
pnew->c = c;
pnew->lchild = NULL;
pnew->rchild = NULL;

你循环调用 没设置终止条件! 加个判空

img