郝斌數(shù)據(jù)結(jié)構(gòu)自學(xué)教程(78集全)上課板書和源代碼查看簡(jiǎn)介

在P74里,郝斌老師,在結(jié)構(gòu)體創(chuàng)建時(shí),沒(méi)有賦初值,而是在后面的Create...函數(shù)里賦的初值。
我嘗試在結(jié)構(gòu)里里面賦初值,而在后面函數(shù)里只建立部分連接,導(dǎo)致程序最后運(yùn)行到一半就卡住。
這是我的錯(cuò)誤源代碼:
#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("以下是先序遍歷的結(jié)果:\n");
PreTraverse(BTHead);
printf("\n");
printf("以下是中序遍歷的結(jié)果:\n");
InTraverse(BTHead);
printf("\n");
printf("以下是后序遍歷的結(jié)果:\n");
PostTraverse(BTHead);
}
//創(chuàng)建鏈?zhǔn)綐?/p>
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;
}
//遍歷鏈?zhǔn)綐?/p>
//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);
}
在上網(wǎng)搜索原因后,才得知,C語(yǔ)言結(jié)構(gòu)體里不能賦初始值!
不知道為什么的,看參考鏈接:https://blog.csdn.net/Dontla/article/details/117920832
修改后的正確代碼:
【與上面的錯(cuò)誤代碼相比,這里的代碼只是將結(jié)構(gòu)體里的賦初值那部分去掉,然后在Create...函數(shù)里手動(dòng)為有空孩子的節(jié)點(diǎn)賦值為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("以下是先序遍歷的結(jié)果:\n");
PreTraverse(BTHead);
printf("\n");
printf("以下是中序遍歷的結(jié)果:\n");
InTraverse(BTHead);
printf("\n");
printf("以下是后序遍歷的結(jié)果:\n");
PostTraverse(BTHead);
}
//創(chuàng)建鏈?zhǔn)綐?/p>
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;
}
//遍歷鏈?zhǔn)綐?/p>
//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);
}