报错那句不知道问题在哪,调试之后发现在main函数第二个insert哪里出错
```c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int ElementType;
struct BST;
typedef struct BST* Tree;
typedef struct BST* Position;
void MakeEmpty(Tree T);
Position Find(Tree T, ElementType X);
Position FindMin(Tree T);
Position FindMax(Tree T);
Tree Insert(Tree T, ElementType X);
Tree Delete(Tree T, ElementType X);
void PrintBST(Tree T);
struct BST
{
Position LeftChild;
Position RightChild;
ElementType Value;
};
#include "BST.h"
void MakeEmpty(Tree T) {
if (T != NULL)
{
MakeEmpty(T->LeftChild);
MakeEmpty(T->RightChild);
free(T);
}
}
Position Find(Tree T, ElementType X) {
if (T == NULL)
return NULL;
else if (X < T->Value)
return Find(T->LeftChild, X);
else if (X > T->RightChild)
return Find(T->RightChild, X);
else
return T;
}
Position FindMin(Tree T) {
if (!T->LeftChild)
return T;
else
return FindMin(T->LeftChild);
}
Position FindMax(Tree T) {
while (T->RightChild)
T = T->RightChild;
return T;
}
Tree Insert(Tree T, ElementType X) {
if (!T)
{
T = (Tree)malloc(sizeof(struct BST));
T->Value = X;
T->LeftChild = T->RightChild = NULL;
}
else if (X < T->Value)
T->LeftChild = Insert(T->LeftChild,X);
else if (X > T->Value)
T->RightChild = Insert(T->RightChild,X);
return T;
}
Tree Delete(Tree T, ElementType X) {
Position tmpcell;
if (T == NULL)
return NULL;
else if (X < T->Value)
T->LeftChild = Delete(T->LeftChild, X);
else if (X > T->Value)
T->RightChild = Delete(T->RightChild, X);
else if (T->LeftChild && T->RightChild)
{
tmpcell = FindMin(T->RightChild);
T->Value = tmpcell->Value;
Delete(tmpcell,X);
}
else
{
tmpcell = T;
if (T->LeftChild == NULL)
T = T->RightChild;
else
{
T = T->LeftChild;
}
free(tmpcell);
}
return T;
}
void PrintBST(Tree T) {
if (!T)
return;
else
{
printf("%d", T->Value);
PrintBST(T->LeftChild);
PrintBST(T->RightChild);
}
}
```c
#include "BST.h"
int main()
{
Tree T = malloc(sizeof(struct BST));
Insert(T, 7);
Insert(T, 3);
Insert(T, 8);
Insert(T, 2);
Insert(T, 5);
PrintBST(T);
}
兄弟,我看了一下你的插入函数,问题就是段错误,你看你初始化的时候,你没有把T的左右孩子初始化为空值,所以你看你这个插入函数刚进来的时候,你的左右孩子的指向了一片野地址所以,当你的根节点进入插入函数之后判断不为空,这个时候你输入的值x肯定是大于根节点的值的,所以就会递归调用你的右孩子值,但是右孩子这个时候又指向野地址怎么判断它的值和value的大小呢?你看
所以我在主函数里面将根节点的左右孩子都初始化为NULL这样在递归调用到右孩子的时候他就会判断到右孩子是null然后就给他开辟空间再赋值,这样就不会发生段错误了
当然这样只是有结果,并不能说明你这个树建立好了,你可以看到第一行输出的是一串乱码,这是因为你的根节点并没有赋初值,所以当你递归调用的时候,你输入的值实际上不知道跟哪个值在比较,所以就会出现第一行的乱码,所以你应该再解决一下你的根节点的问题,你可以在进入函数之后判断他是不是根节点,或者对根节点单独操作,还有一个就是我最开始觉的就算是解决了上述问题你这个BST建立的还是有问题,你想这个搜索树的建立怎么能简单的递归呢,那我给数据的时候随便给,那插进去不是乱了吗,后来一想,这不是插入排序么,你每次进来都是把你的数放到合适的位置才停,肯定乱不了,回答你的问题,我确实学到了不少东西啊,哈哈哈,当然我还没改好,等我改好了我把我的代码贴到下面供你参考,你先看着改改
希望以后能有机会跟你一起探讨C语言和数据结构