Tengo una tarea que piden de mí para crear una estructura de árbol binario de búsqueda donde su nodo del árbol de búsqueda binaria es otro árbol de búsqueda binaria. La primera BST tiene los apellidos de los estudiantes y la otra tiene los nombres y ID. Además, si alguien tiene el mismo apellido con otro estudiante no debe crear otro nodo apellido pero tengo que crear dentro del nodo apellido que existe otro nombre e Id nodo. Para ser más especifico:
typedef struct nameANDid{ //name and id nodes
char first[20];
int ID;
struct nameANDid *nleft;
struct nameANDid *nright;
}yohoho;
typedef struct node{ //surname nodes
char last[20];
struct nameANDid yohoho;
struct node *left;
struct node *right;
}node;
Mi principal problema es cómo crear un nodo nameANDid diferente para cada apellido, porque he encontrado con el siguiente código se crea una BST 2 para los apellidos y otro para los nombres, pero me gustaría ser como por ejemplo: Si tengo estos estudiantes
Stallone Sylvester 11111111
Stallone Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Hogan Daniel 55555555
Quiero guardar como esto: .........
Stallone Sylvester 11111111
Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Daniel 55555555
En lugar de esto tomo algo como: ...........
Stallone Sylvester 11111111.
Noah 22222222
Chuck 33333333
Hulk 44444444
Daniel 55555555
Norris Sylvester 11111111.
Noah 22222222
Chuck 33333333
Hulk 44444444
Daniel 55555555
Hogan Sylvester 11111111.
Noah 22222222
Chuck 33333333
Hulk 44444444
Daniel 55555555
Voy a poner aquí algunas funciones con el fin de ser más específicos
La función de carga carga los nombres de un documento txt.
void loadData(struct node *temp){
int i;
FILE *fp;
fp=fopen(FILENAME,r);
if (fp == NULL) printf(File does not exist\n);
for (i=0; i<5; i++){
fscanf(fp,%s,&temp->last);
fscanf(fp,%s,&temp->yohoho.first);
fscanf(fp,%d,&temp->yohoho.ID);
top=add_node(top,temp); //this function create a surname node
}
fclose(fp);
printf(\n\nFile loaded\n);
}
dónde
struct node temp;//just a node pointer
struct node *top=NULL; //shows the top of the tree
La función addnode es: ...
struct node * add_node (struct node *top, struct node *temp){
struct node *newNode;
if (top == NULL){
newNode=(struct node *)malloc(sizeof(struct node));
temp->left=NULL;
temp->right=NULL;
if (memcpy(newNode,temp,sizeof(struct node)) == NULL){
printf(Node addition failed\n);
return NULL;}
else {
topname=add_node_nameANDid(topname,&temp->yohoho); //Call the add_node_nameANDid to create a new name node in the other tree
return newNode;}
}
else {
if (stricmp(temp->last,top->last) < 0){ //Insert node surname left
top->left=add_node(top->left,temp);}
else if (stricmp(temp->last,top->last) == 0){
topname=add_node_nameANDid(topname,&temp->yohoho); //Call the add_node_nameANDid to create a new name node in the other tree if i have the same surname
}
else {
top->right=add_node(top->right,temp);
}
return top;
}
return NULL;
}
Y la función add_node_nameANDid () es como la función anterior, pero tiene algunas variables cambiaron:
struct nameANDid * add_node_nameANDid (struct nameANDid *topname, struct nameANDid *temp2){
struct nameANDid *newNode_nameANDid;
if (topname == NULL){
newNode_nameANDid=(struct nameANDid *)malloc(sizeof(struct nameANDid));
temp2->nleft=NULL;
temp2->nright=NULL;
if (memcpy(newNode_nameANDid,temp2,sizeof(struct nameANDid)) == NULL){
printf(Node addition failed\n);
return NULL;}
else {
return newNode_nameANDid;}
}
else {
if (stricmp(temp2->first,topname->first) <= 0){
topname->nleft=add_node_nameANDid(topname->nleft,temp2);}
else {
topname->nright=add_node_nameANDid(topname->nright,temp2);}
return topname;
}
return NULL;
}
Lo siento por el gran código fuente que acaba de subir, pero sería muy difícil de explicar sin esto.
Creo que tengo dos problemas, pero no tengo los conocimientos necesarios para resolverlos.
PRIMERO: Tengo que crear diferentes BST apellido para cada nodo apellido y creo que no hago eso, pero no sé cómo hacerlo ...
¿Alguna sugerencia?













