用树的兄弟存储法存储数据,交互输入信息,然后先序遍历输出,问题出在哪里?

#include
#include
#include
#include
typedef struct Tnode
{
int no; //数据元素编号
char *data; //数据元素域
struct Tnode *Child1; //第1个孩子指针域
struct Tnode *Sibling; //下1个兄弟指针域
}Node,*Tcs;
//链栈存储结构
typedef struct Snode
{
struct Tnode *tnode;
struct Snode *next;
}*Stack;
//向栈顶压入元素data
void Push(Stack &S,Tcs tnode)
{
Stack p = (Stack)malloc(sizeof(Tnode));
p->tnode = tnode;
p->next = S->next;
S->next = p;
}//Push
void Pop(Stack &S, Tcs &tnode)
{
Stack p = S->next;
if (p)
{
S->next = p->next;
tnode = p->tnode;
free(p);
}
else tnode = NULL;
}//Pop
void CreatTree(Tcs T, Stack S)//建立树的存储结构
{
Tcs p=NULL;
if (p->no != -1)//编号为-1结束
{
//申请一个树结点
p = (Tcs)malloc(sizeof(Node));
scanf("%d", &p->no);//读编号
if (p->no scanf("%s",p->data);//读入元素数据
//p->data[strlen(p->data) - 1] = '\0';
p->Child1 = p->Sibling = NULL;

    if (p->no / 10 == T->no)//第一个孩子
    {
        Push(S, T);
        T->Child1 = p;
    }
    else
    {
        //当编号小于上层时,返回上层
        while (p->no < T->no)Pop(S, T);
        T->Sibling = p;
    }
    CreatTree(p, S);
    return;
}

}//CreateTree
void Print(Tcs T)
{
//先序遍历输出信息
if (!T) return;//递归出口
printf("%5d %5s ", T->no, T->data);//输出第一个孩子信息
printf("%5d %5s (%5d-%5d)\n", T->no, T->data, T->Child1 ? T->Child1->no : 0, T->Sibling ? T->Sibling->no : 0);//输出兄弟结点信息
Print(T->Child1);
Print(T->Sibling);
}//Print
int main()
{
//建立树根结点
Tcs p = (Tcs)malloc(sizeof(Node));
p->no = 0;
scanf("%s", p->data);
p->Child1 = p->Sibling = NULL;
//建立空栈
Stack s = (Stack)malloc(sizeof(Tnode));
s->next = NULL;
CreatTree(p, s);//建立树
Print(p);//输出信息
putchar(10);
system("pause");
return 0;
}

if (p->no scanf("%s",p->data);//读入元素数据
这句就有语法错误。另外,具体有什么问题,让大家看到你努力的调试后还是没有找到问题,这样大家就更愿意去帮你,以上。

这是你的代码

#include <stdio.h>
#include <stdlib.h>

typedef struct Tnode
{
    int no; //数据元素编号
    char *data; //数据元素域
    struct Tnode *Child1; //第1个孩子指针域
    struct Tnode *Sibling; //下1个兄弟指针域
}Node, *Tcs;

//链栈存储结构
typedef struct Snode
{
    struct Tnode *tnode;
    struct Snode *next;
}*Stack;

//向栈顶压入元素data
void Push(Stack &S, Tcs tnode)
{
    Stack p = (Stack)malloc(sizeof(Tnode));
    p->tnode = tnode;
    p->next = S->next;
    S->next = p;
}//Push

void Pop(Stack &S, Tcs &tnode)
{
    Stack p = S->next;
    if (p)
    {
        S->next = p->next;
        tnode = p->tnode;
        free(p);
    }
    else tnode = NULL;
}//Pop

void CreatTree(Tcs T, Stack S)//建立树的存储结构
{
    Tcs p = NULL;
    if (p->no != -1)//编号为-1结束
    {
        //申请一个树结点
        p = (Tcs)malloc(sizeof(Node));
        //printf("p->data: ");
        scanf("%d", &p->no);//读编号
        //printf("p->data: %s", p->data);
        if (p->no) scanf("%s", p->data);//读入元素数据
        //p->data[strlen(p->data) - 1] = '\0';
        p->Child1 = p->Sibling = NULL;
        if (p->no / 10 == T->no)//第一个孩子
        {
            Push(S, T);
            T->Child1 = p;
        }
        else
        {
            //当编号小于上层时,返回上层
            while (p->no < T->no)Pop(S, T);
            T->Sibling = p;
        }
        CreatTree(p, S);
        return;
    }
}//CreateTree

void Print(Tcs T)
{
    //先序遍历输出信息
    if (!T) return;//递归出口
    printf("%5d %5s ", T->no, T->data);//输出第一个孩子信息
    printf("%5d %5s (%5d-%5d)\n", T->no, T->data, T->Child1 ? T->Child1->no : 0, T->Sibling ? T->Sibling->no : 0);//输出兄弟结点信息
    Print(T->Child1);
    Print(T->Sibling);
}//Print

int main()
{
    //建立树根结点
    Tcs p = (Tcs)malloc(sizeof(Node));
    p->no = 0;
    scanf("%s", p->data);
    //printf("p->data: %s", p->data);
    p->Child1 = p->Sibling = NULL;
    //建立空栈
    Stack s = (Stack)malloc(sizeof(Tnode));
    s->next = NULL;
    CreatTree(p, s);//建立树
    Print(p);//输出信息
    putchar(10);
    system("pause");
    return 0;
}

主要是你的Node节点中char* data和scanf("%s", p->data)的问题

你可以拿这一小段测试一下

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char ch1;
    printf("Enter ch1: ");
    scanf("%s", &ch1);
    printf("%c\n", ch1);

    char* ch2 = NULL;    // 改成char* ch2 = (char*)malloc(sizeof(100));可以运行
    printf("Enter ch2: ");
    scanf("%s", ch2);
    printf("%s\n", ch2);

    return 0;
}

你只给p分配了内存

但是data是一个char类型的指针,你没有给它**分配内存空间!!!**

因此原来的代码应该改下,还有就是CreatTree也是错的

p都没分配内存怎么来的p->no??

就算你改了,if (p->no)之前p->no的赋值呢??