我在属于二叉搜索树的节点中输入一个链表,该链表遵循以下结构(没有不涉及任何问题的元素(:
// BINARY SEARCH TREE
typedef struct Equipo {
char nombre[50];
// [...]
Lista *pilotos;
struct nodo *izquierdo;
struct nodo *derecho;
} Equipo;
typedef Equipo Arbol;
// LINKED LIST
typedef struct Piloto {
int dorsal;
// [....]
} Piloto;
typedef struct Nodo {
struct Piloto piloto;
struct Nodo *siguiente;
} Nodo;
typedef struct Lista {
Nodo *cabeza;
int longitud;
} Lista;
为了在链表中插入新的Pilotos
,我使用在列表的初始化处插入的函数:
void InsertarCabezaLista(Lista *l, Piloto *piloto) {
Nodo *n = CrearNodo(piloto);
n->siguiente = l->cabeza;
l->cabeza = n;
l->longitud++;
}
对于插入Equipo
,它使用了以下功能:
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 {
// Los elementos menores a la izq, los elementos
// mayores a la der.
int comparado = strncmp(e->nombre, (*arbol)->nombre, 50);
if (comparado > 0) {
InsertarEquipo(&(*arbol)->izquierdo, e);
} else {
InsertarEquipo(&(*arbol)->derecho, e);
}
}
}
如您所见,插入方式不同,因为Equipo
属于二叉搜索树,Piloto
属于链表。
main
中,我创建了二叉搜索树的 2 个节点 (Equipo
(:
Equipo *equipo = (Equipo *)malloc(sizeof(Equipo));
strcpy(equipo->nombre, "Ducati Team");
strcpy(equipo->marcaMoto, "Ducati");
equipo->puntuaciones = 0;
Arbol *arbol = CrearEquipo(equipo);
strcpy(equipo->nombre, "Repsol Honda Team");
strcpy(equipo->marcaMoto, "Honda");
equipo->puntuaciones = 0;
InsertarEquipo(&arbol, equipo);
后来,链表的 3 个节点 (Piloto
( 并将Piloto
插入Equipo
中,名称来自Equipo
:
Piloto *piloto = malloc(sizeof(piloto));
piloto->dorsal = 99;
strcpy(piloto->apellido, "Lorenzo");
InsertarPilotoEquipo(arbol, "Ducati Team", piloto);
piloto->dorsal = 93;
strcpy(piloto->apellido, "Márquez");
InsertarPilotoEquipo(arbol, "Repsol Honda Team", piloto);
piloto->dorsal = 26;
strcpy(piloto->apellido, "Pedrosa");
InsertarPilotoEquipo(arbol, "Repsol Honda Team", piloto);
piloto->dorsal = 27;
strcpy(piloto->apellido, "Wallon");
InsertarPilotoEquipo(arbol, "Repsol Honda Team", piloto);
如您所见,树Ducati Team
中的Equipo
有 1 个Piloto
,Repsol Honda Team
有 3 个Piloto
。
这个使用的函数称为InsertarPilotoEquipo
是:
int InsertarPilotoEquipo(Equipo *arbol, char nombre[], Piloto *p) {
if (!arbol) {
return 0;
}
Equipo *equipo = ObtenerEquipo(arbol, nombre);
if (equipo) {
equipo->pilotos = malloc(sizeof(equipo->pilotos));
InsertarCabezaLista(equipo->pilotos, p);
equipo->puntuaciones += p->puntuacion;
return 1;
} else {
return 0;
}
}
没有执行错误。但是当我从树上获取信息时,我得到:
----------------------------
Nombre: Ducati Team
Moto: Ducati
Puntuacón: 46
Pilotos: 1
----------------------------
Dorsal: 99
Nombre: Lorenzo
Puntuacón: 46
----------------------------
Nombre: Repsol Honda Team
Moto: Honda
Puntuacón: 204
Pilotos: 1
----------------------------
Dorsal: 27
Nombre: Wallon
Puntuacón: 68
如我们所见,仅记录树节点中的最后Piloto
。看起来它在树中每个节点的每次调用上都被覆盖了。
为了排除打印问题,我显示了打印数据的函数:
void BusquedaPreOrder(Equipo *arbol) {
if (arbol) {
printf("ntt----------------------------");
printf("nttNombre: %s", arbol->nombre);
printf("nttMoto: %s", arbol->marcaMoto);
printf("nttPuntuacón: %d", arbol->puntuaciones);
printf("nttPilotos: %d", arbol->pilotos->longitud);
printf("ntt----------------------------");
for (int i = 0; i < arbol->pilotos->longitud; i++) {
ImprimirPiloto(i, arbol->pilotos);
}
printf("n");
BusquedaPreOrder(arbol->izquierdo);
BusquedaPreOrder(arbol->derecho);
}
}
它被简单地称为BusquedaPreOrder(arbol);
.
我认为问题在于每个InsertPilotoEquipo
函数中equipo->pilotos = malloc(sizeof(equipo->pilotos));
的调用,按树。但是我不知道为什么或解决方案是什么。
最后,我解决了这个问题,检查树列表是否已初始化; 如果它没有初始化,如果它继续使用它(在每次调用时将其初始化为新之前(:
int InsertarPilotoEquipo(Equipo* arbol, char nombre[], Piloto* p) {
if (!arbol) {
return 0;
}
Equipo* equipo = ObtenerEquipo(arbol, nombre);
// ImprimirEquipo(equipo);
if (equipo) {
if (!equipo->pilotos) {
equipo->pilotos = malloc(sizeof(equipo->pilotos));
}
InsertarCabezaLista(equipo->pilotos, p);
equipo->puntuaciones += p->puntuacion;
return 1;
} else {
return 0;
}
}