欢迎光临散文网 会员登陆 & 注册

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

2023-08-19 17:21 作者:圣凯shengkai  | 我要投稿

在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);

}


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

分享到微博请遵守国家法律