c - 二叉搜索树,递归函数 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;
树中的搜索将由字符串nombre
a执行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]
解决方案
我认为问题出在这里:
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。
推荐阅读
- python - 二级外键关系
- flutter - 我怎样才能在颤动中做这种类型的渐变
- flutter - 在 dispose() 之后调用 setState() 导致 SpinKit 包内的错误
- javascript - 使用 Code.gs 中的 javascript 从数组值中获取动态 html 表
- javascript - jQuery:单击按钮时重置滚动条
- authentication - 在 webview android 中加载 url 时如何清除基本身份验证凭据
- python - 有没有办法在同时与另一个元素交互时显式等待元素?
- javascript - 隐藏单选按钮名称/标签以及按钮
- javascript - React Native - 获取文本的行数(在呈现之前)
- javascript - 在 foreach 循环中使用 var 的值