C - 在链表中插入会覆盖值



我在属于二叉搜索树的节点中输入一个链表,该链表遵循以下结构(没有不涉及任何问题的元素(:

// 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 个PilotoRepsol 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;
}
}

相关内容

  • 没有找到相关文章

最新更新