首页 > 解决方案 > 二叉搜索树,递归函数 Exsists 在比较字符串中抛出“core dumped”

问题描述

我有以下结构来定义二叉搜索树:

typedef struct Equipo {
    char nombre[50];
    char marcaMoto[30];
    int puntuaciones;
    struct Piloto pilotos[18];
    struct nodo* izquierdo;
    struct nodo* derecho;
} Equipo;

typedef Equipo Arbol;

树中的搜索将由字符串nombrea执行char [50]。对于创建树和插入数据,我使用以下函数:

Equipo* CrearEquipo(Equipo* e) {
    Equipo* n = (Equipo *) malloc(sizeof(Equipo));
    strncpy(n->nombre, e->nombre, 50);
    strncpy(n->marcaMoto, e->marcaMoto, 30);
    n->puntuaciones = 0;
    n->derecho = n->izquierdo = NULL;
    return n;
}

void InsertarEquipo(Equipo** arbol, Equipo* e) {
    if (*arbol == NULL) {
        Equipo* n = CrearEquipo(e);
        *arbol = n;
    } else {
        int comparado = strncmp(e->nombre, (*arbol)->nombre, 50);
        if (comparado > 0) {
            InsertarEquipo(&(*arbol)->izquierdo, e);
        } else {
            InsertarEquipo(&(*arbol)->derecho, e);
        }
    }
}

main我使用这个函数来创建测试元素:

    Equipo* equipo = (Equipo *) malloc(sizeof(Equipo));
    strcpy(equipo->nombre, "C"); 
    strcpy(equipo->marcaMoto, "B"); 

    Arbol *arbol = CrearEquipo(equipo);

    strcpy(equipo->nombre, "B"); 
    strcpy(equipo->marcaMoto, "B"); 
    InsertarEquipo(&arbol, equipo);

    strcpy(equipo->nombre, "A"); 
    strcpy(equipo->marcaMoto, "B"); 
    InsertarEquipo(&arbol, equipo);

    strcpy(equipo->nombre, "E"); 
    strcpy(equipo->marcaMoto, "B"); 
    InsertarEquipo(&arbol, equipo);

稍后,如果存在于树中,我将创建递归函数以进行comprobate:

int ExisteEquipo(Equipo* arbol, char nombre[]) {
    int comparado = strncmp(arbol->nombre, nombre, 50);
    if (!arbol) {
        return 0;
    } else if (comparado > 0) {
        printf("Menor ");
        return ExisteEquipo(arbol->izquierdo, nombre);    
    } else if (comparado < 0) {
        printf("Mayor ");
        return ExisteEquipo(arbol->derecho, nombre);       
    } else {
        printf("Igual ");
        return 1;  
    }
}

printf's用于测试)。当我使用以下方法调用存在函数时:

void DeterminarExistencia(Equipo* arbol, char nombre[50]) {
    if (ExisteEquipo(arbol, nombre)) {
        printf("El nodo %s existe. \n", nombre);
    } else {
        printf("El nodo %s no existe. \n", nombre);
    }
}
DeterminarExistencia(arbol, "E");
DeterminarExistencia(arbol, "C");
DeterminarExistencia(arbol, "H");
DeterminarExistencia(arbol, "B");

但我总是得到错误:Violación de segmento (core dumped) [Núcleo vaciado a un archivo]

标签: cbinary-search-tree

解决方案


我认为问题出在这里:

  int comparado = strncmp(arbol->nombre, nombre, 50);

您在使用上面的行对其进行操作后询问 arbol 是否为空,因此如果它为空,则您正在访问错误的内存地址,这将导致错误。

把它像这样:

if (!arbol) {
    return 0;
int comparado = strncmp(arbol->nombre, nombre, 50);

西班牙语:

Básicamente cambia el orden de lo que te he dicho arriba y deberia funcionar。


推荐阅读