郝斌数据结构自学教程(78集全)上课板书和源代码查看简介

在P74里,郝斌老师,在结构体创建时,没有赋初值,而是在后面的Create...函数里赋的初值。
我尝试在结构里里面赋初值,而在后面函数里只建立部分连接,导致程序最后运行到一半就卡住。
这是我的错误源代码:
#include <stdio.h>
#include <malloc.h>
struct BTNode {
struct BTNode* pLchild = NULL;
char BTData;
struct BTNode* pRchild = NULL;
};
struct BTNode* CreateTree();
void PreTraverse(BTNode* BTree);
void InTraverse(BTNode* BTree);
void PostTraverse(BTNode* BTree);
int main()
{
struct BTNode* BTHead = CreateTree();
printf("以下是先序遍历的结果:\n");
PreTraverse(BTHead);
printf("\n");
printf("以下是中序遍历的结果:\n");
InTraverse(BTHead);
printf("\n");
printf("以下是后序遍历的结果:\n");
PostTraverse(BTHead);
}
//创建链式树
struct BTNode* CreateTree()
{
struct BTNode* NodeA = (struct BTNode*)malloc(sizeof(BTNode));
struct BTNode* NodeB = (struct BTNode*)malloc(sizeof(BTNode));
struct BTNode* NodeC = (struct BTNode*)malloc(sizeof(BTNode));
struct BTNode* NodeD = (struct BTNode*)malloc(sizeof(BTNode));
struct BTNode* NodeE = (struct BTNode*)malloc(sizeof(BTNode));
NodeA->BTData = 'A';
NodeB->BTData = 'B';
NodeC->BTData = 'C';
NodeD->BTData = 'D';
NodeE->BTData = 'E';
NodeA->pLchild = NodeB;
NodeA->pRchild = NodeC;
NodeC->pLchild = NodeD;
NodeD->pRchild = NodeE;
return NodeA;
}
//遍历链式树
//1.先序遍历
void PreTraverse(BTNode* BTree)
{
if (BTree == NULL)
{
return;
}
printf("%c ", BTree->BTData);
PreTraverse(BTree->pLchild);
PreTraverse(BTree->pRchild);
}
//2.中序遍历
void InTraverse(BTNode* BTree)
{
if (BTree == NULL)
{
return;
}
PreTraverse(BTree->pLchild);
printf("%c ", BTree->BTData);
PreTraverse(BTree->pRchild);
}
//3.后序遍历
void PostTraverse(BTNode* BTree)
{
if (BTree == NULL)
{
return;
}
PreTraverse(BTree->pLchild);
PreTraverse(BTree->pRchild);
printf("%c ", BTree->BTData);
}
在上网搜索原因后,才得知,C语言结构体里不能赋初始值!
不知道为什么的,看参考链接:https://blog.csdn.net/Dontla/article/details/117920832
修改后的正确代码:
【与上面的错误代码相比,这里的代码只是将结构体里的赋初值那部分去掉,然后在Create...函数里手动为有空孩子的节点赋值为NULL】
#include <stdio.h>
#include <malloc.h>
struct BTNode {
/*正确写法*/
struct BTNode* pLchild;
char BTData;
struct BTNode* pRchild;
};
struct BTNode* CreateTree();
void PreTraverse(BTNode* BTree);
void InTraverse(BTNode* BTree);
void PostTraverse(BTNode* BTree);
int main()
{
struct BTNode* BTHead = CreateTree();
printf("以下是先序遍历的结果:\n");
PreTraverse(BTHead);
printf("\n");
printf("以下是中序遍历的结果:\n");
InTraverse(BTHead);
printf("\n");
printf("以下是后序遍历的结果:\n");
PostTraverse(BTHead);
}
//创建链式树
struct BTNode* CreateTree()
{
struct BTNode* NodeA = (struct BTNode*)malloc(sizeof(BTNode));
struct BTNode* NodeB = (struct BTNode*)malloc(sizeof(BTNode));
struct BTNode* NodeC = (struct BTNode*)malloc(sizeof(BTNode));
struct BTNode* NodeD = (struct BTNode*)malloc(sizeof(BTNode));
struct BTNode* NodeE = (struct BTNode*)malloc(sizeof(BTNode));
NodeA->BTData = 'A';
NodeB->BTData = 'B';
NodeC->BTData = 'C';
NodeD->BTData = 'D';
NodeE->BTData = 'E';
NodeA->pLchild = NodeB;
NodeA->pRchild = NodeC;
NodeB->pLchild = NULL;
NodeB->pRchild = NULL;
NodeC->pLchild = NodeD;
NodeC->pRchild = NULL;
NodeD->pLchild = NULL;
NodeD->pRchild = NodeE;
NodeE->pLchild = NULL;
NodeE->pRchild = NULL;
return NodeA;
}
//遍历链式树
//1.先序遍历
void PreTraverse(BTNode* BTree)
{
if (BTree == NULL)
{
return;
}
printf("%c ", BTree->BTData);
PreTraverse(BTree->pLchild);
PreTraverse(BTree->pRchild);
}
//2.中序遍历
void InTraverse(BTNode* BTree)
{
if (BTree == NULL)
{
return;
}
PreTraverse(BTree->pLchild);
printf("%c ", BTree->BTData);
PreTraverse(BTree->pRchild);
}
//3.后序遍历
void PostTraverse(BTNode* BTree)
{
if (BTree == NULL)
{
return;
}
PreTraverse(BTree->pLchild);
PreTraverse(BTree->pRchild);
printf("%c ", BTree->BTData);
}