C# · 12月 19, 2021

Devc++ 错误信息:Program received signal SIGSEGV, Segmentation fault.

@H_4040@#define EQ(a,b) ((a) == (b))

@H4040@#define LT(a,b) ((a) < (b))

@H4040@#define LQ(a,b) ((a) > (b))

@H4040@typedef int ElemType;

@H4040@typedef struct{

@H4040@ElemType key;

@H4040@}SElemType;

@H4040@typedef struct BiNode{

@H4040@SElemType data;

@H4040@struct BiNode lchild,rchild;

@H4040@}BiNode,*BiTree;

@H4040@BiTree T;

@H4040@Status CreateDST(BiTree &T,int n){

@H4040@int i;

@H4040@ElemType key;

@H4040@for(i=1;i<=n;i++){

@H4040@printf(“请输入第%d个元素:”,i);

@H4040@scanf(“%d”,&key);

@H4040@InseartBST(T,key);

@H4040@}

@H4040@return OK;

@H4040@}

@H4040@Status SearchBST(BiTree T,ElemType key,BiTree f,BiTree &p){

@H4040@if(!T){

@H4040@p=f;

@H4040@return FALSE;

@H4040@}

@H4040@else if(EQ(key,T->data.key)){

@H4040@p = T;

@H4040@return TRUE;

@H4040@}else if(LT(key,T->data.key)){

@H4040@return SearchBST(T->lchild,key,T,p);

@H4040@}else{

@H4040@return SearchBST(T->rchild,p);

@H4040@}

@H4040@}

@H4040@Status InseartBST(BiTree &T,ElemType key){

@H4040@BiTree p;

@H4040@if(!SearchBST(T,NULL,p)){

@H4040@BiTree s;

@H4040@s = (BiTree)malloc(sizeof(BiNode));

@H4040@if(!s) return ERROR;

@H4040@s->data.key = key;

@H4040@s->lchild = s->rchild = NULL;

@H4040@if(!p) T = s;

@H4040@else if(LT(key,p->data.key)) p->lchild = s;

@H4040@else p->rchild = s;

@H4040@return TRUE;

@H4040@}else return FALSE;

@H4040@}

@H4040@上面的信息是在我编写二叉排序树创建,查找,插入元素时产生的,产生的原因如下:

@H404_0@BiTree T;//首先声明一个二叉树类型的指针变量,但是变量T只是一个地址,大多数情况下不为NULL.这便是产生上述错误的主要原因(将T赋值为NULL即可)。

@H_4040@CreateDST(T,n); //接着,创建二叉排序树

@H4040@InseartBST(T,key); // 向排序树中插入元素key

@H4040@SearchBST(T,p)  //在插入元素key之前,要先查找树中是否存在与key相同的元素,不存在才会插入到树中

@H404_0@但是由于变量T不为空,下面本应执行的代码并没有执行:

@H_4040@if(!T){

@H4040@

@H4040@        p=f;

@H4040@

@H4040@        return FALSE;

@H4040@

@H4040@    }

@H404_0@而是执行下面的代码:

@H_4040@else if(EQ(key,T->data.key)){

@H4040@

@H4040@        p = T;

@H4040@

@H4040@        return TRUE;

@H4040@

@H4040@    }else if(LT(key,T->data.key)){

@H4040@

@H4040@        return SearchBST(T->lchild,p);

@H4040@

@H4040@    }else{

@H4040@

@H4040@        return SearchBST(T->rchild,p);

@H4040@

@H4040@    }

@H4040@但是开头只是声明了变量T,并没有为其开辟空间,所以T->data.key是有问题的,最终导致了上面的问题。

@H404_0@故而只需把T赋值为空即可。