6-12 L'opération d'arborescence de recherche binaire définit une erreur d'exécution d'exemple / VS2019 indique que wntdll n'est pas chargé

Vous pouvez d'abord vérifier s'il y a un problème avec les opérations de gestion de la mémoire, comme la suppression d'un pointeur qui a été à nouveau supprimé. Cela peut ne pas être évident et a été supprimé dans un endroit discret. En général, c'est la source du problème.

Il n'y a aucun problème avec le débogage dans DEV, mais comme PTA est toujours incapable de passer, je ne peux copier le code à contrecœur dans VS2019 pour voir.

Il s'agit du code avant la recherche d'erreur initiale.

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    
    
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

void PreorderTraversal( BinTree BT ); /* 先序遍历,由裁判实现,细节不表 */
void InorderTraversal( BinTree BT );  /* 中序遍历,由裁判实现,细节不表 */

BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );

int main()
{
    
    
    BinTree BST, MinP, MaxP, Tmp;
    ElementType X;
    int N, i;

    BST = NULL;
    scanf("%d", &N);
    for ( i=0; i<N; i++ ) {
    
    
        scanf("%d", &X);
        BST = Insert(BST, X);
    }
    printf("Preorder:"); PreorderTraversal(BST); printf("\n");
    MinP = FindMin(BST);
    MaxP = FindMax(BST);
    scanf("%d", &N);
    for( i=0; i<N; i++ ) {
    
    
        scanf("%d", &X);
        Tmp = Find(BST, X);
        if (Tmp == NULL) printf("%d is not found\n", X);
        else {
    
    
            printf("%d is found\n", Tmp->Data);
            if (Tmp==MinP) printf("%d is the smallest key\n", Tmp->Data);
            if (Tmp==MaxP) printf("%d is the largest key\n", Tmp->Data);
        }
    }
    scanf("%d", &N);
    for( i=0; i<N; i++ ) {
    
    
        scanf("%d", &X);
        BST = Delete(BST, X);
    }
    printf("Inorder:"); InorderTraversal(BST); printf("\n");

    return 0;
}





BinTree Insert( BinTree BST, ElementType X ){
    
    
	
	if(BST== NULL){
    
    
		//新建结点
		
		BST= (BinTree)(malloc(sizeof(struct TNode))); 
		BST->Data= X;
		BST->Left= NULL;
		BST->Right= NULL;
		return BST;
	} 
	if(X<BST->Data){
    
    
		BST->Left= Insert(BST->Left, X);
	}
	else{
    
    

		BST->Right= Insert(BST->Right, X);
	} 
	
	return BST;
	
	
}


//寻找最小值
Position FindMin( BinTree BST ){
    
    
	if(BST== NULL) return NULL;
	if(BST->Left==NULL){
    
    
		return BST;
	} 
	else
		return FindMin(BST->Left);

} 

//寻找最大值 
Position FindMax( BinTree BST ){
    
    
		if(BST== NULL) return NULL;
		if(BST->Right==NULL){
    
    
		return BST;
	} 
	else
		return FindMax(BST->Right);	
}
 
 
//寻找指定值
Position Find( BinTree BST, ElementType X ){
    
    		
		if(BST==NULL) return NULL;//没有找到 
		if(X== BST->Data) return BST; 
		else if(X<BST->Data) return Find(BST->Left, X);//向左找 
		else return Find(BST->Right, X);//向右找 
} 


//删除指定结点
BinTree Delete( BinTree BST, ElementType X ){
    
    
	//搜索移动指针过程 
	//无法找到
	if(BST== NULL) {
    
    
		printf("Not Found\n");
		return NULL; 
	} 
	//中途过程 
	else if(X<BST->Data){
    
    
		BST->Left= Delete(BST->Left, X);
	} 
	else if(X>BST->Data){
    
    
		BST->Right= Delete(BST->Right,X);		
	} 
	//找到 
	else{
    
    
		BinTree temp;
		temp= BST;
		if(BST->Left==NULL){
    
    
			temp= BST;
			BST= BST->Right;
			free(temp);
		}
		else if(BST->Right==NULL){
    
    
			temp= BST;
			BST= BST->Left;
			free(temp);
		}
		else{
    
    
			//左右双全 将结点的值替换 删除右子树最小的 
			BinTree rightMin= FindMin(BST->Right);
			BST->Data= rightMin->Data;
			BST->Right= Delete(BST->Right, rightMin->Data);
			free(rightMin);
		} 
		
		
	} 
	return BST;
} 

//中序遍历
void InorderTraversal(BinTree BST){
    
    
	if(BST==NULL){
    
    
		return; //终止 
	}
	else {
    
    
	
		InorderTraversal(BST->Left);
		printf("%d",BST->Data);
		InorderTraversal(BST->Right);
	}
} 


//前序遍历
void PreorderTraversal(BinTree BST){
    
    
	if(BST==NULL){
    
    
		return; //终止 
	}
	else {
    
    
		printf("%d",BST->Data);
		PreorderTraversal(BST->Left);
		PreorderTraversal(BST->Right);
	}
} 


Un point d'arrêt a été déclenché dans VS2019, promptInsérez la description de l'image ici

En vérifiant les blogs associés, vous constaterez que c'est probablement un problème lié à la gestion de la mémoire.Pour ce code, plus mon estimation de ma capacité de programmation C, étant donné que plusieurs autres points ont été passés, le problème est presque impossible. Sortie dans le module Supprimer.

//删除指定结点
BinTree Delete(BinTree BST, ElementType X) {
    
    
	//搜索移动指针过程 
	//无法找到
	if (BST == NULL) {
    
    
		printf("Not Found\n");
		return NULL;
	}
	//中途过程 
	else if (X < BST->Data) {
    
    
		BST->Left = Delete(BST->Left, X);
	}
	else if (X > BST->Data) {
    
    
		BST->Right = Delete(BST->Right, X);
	}
	//找到 
	else {
    
    
		BinTree temp;
		temp = BST;
		if (BST->Left == NULL) {
    
    
			temp = BST;
			BST = BST->Right;
			free(temp);
		}
		else if (BST->Right == NULL) {
    
    
			temp = BST;
			BST = BST->Left;
			free(temp);
		}
		else {
    
    
			//左右双全 将结点的值替换 删除右子树最小的 
			BinTree rightMin = FindMin(BST->Right);
			BST->Data = rightMin->Data;
			BST->Right = Delete(BST->Right, rightMin->Data);
			free(rightMin);
		}


	}
	return BST;
}

J'ai essayé de commenter toutes les opérations liées à la libération de mémoire, car PTA ne nécessite pas de suppression réelle. Dans ce cas, le problème des erreurs d'exécution est résolu.

Regardez attentivement le code, cela devrait être un problème avec ce morceau de code

else {
    
    
			//左右双全 将结点的值替换 删除右子树最小的 
			BinTree rightMin = FindMin(BST->Right);
			BST->Data = rightMin->Data;
			BST->Right = Delete(BST->Right, rightMin->Data);
			free(rightMin);
		}

Étant donné que rightMin doit être une feuille, le pointeur de rightMin a été supprimé dans Delete before free et une erreur est signalée lorsque free est à nouveau exécuté.

Je suppose que tu aimes

Origine blog.csdn.net/roswellnotfound/article/details/108957645
conseillé
Classement