Ho un lavoro che chiedono da me per creare una struttura di albero binario di ricerca in cui il suo nodo dell'albero binario di ricerca è un altro albero binario di ricerca. Il primo BST ha i nomi degli studenti e l'altra ha i nomi e id. Anche se qualcuno ha lo stesso cognome con un altro studente non devo creare un altro nodo cognome ma devo creare all'interno del nodo cognome esistente un altro primo nome e l'ID nodo. Per essere più precisi:
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;
Il mio problema principale è come creare un nodo nameANDid diverso per ogni cognome che ho trovato, perché con il seguente codice creo 2 BST uno per i cognomi e un altro per i nomi, ma vorrei essere come per esempio: Se ho questi studenti
Stallone Sylvester 11111111
Stallone Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Hogan Daniel 55555555
Voglio memorizzarli in questo modo: .........
Stallone Sylvester 11111111
Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Daniel 55555555
Invece di questo prendo qualcosa come: ...........
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
Io metterò qui alcune funzioni al fine di essere più specifici
La funzione CARICA inserisce i nomi da 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);
}
dove
struct node temp;//just a node pointer
struct node *top=NULL; //shows the top of the tree
La funzione addNode è: ...
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;
}
E la funzione add_node_nameANDid () è come la funzione precedente, ma ha cambiato alcune variabili:
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;
}
Ci scusiamo per il codice sorgente di enorme che mi basta caricare ma sarebbe molto difficile spiegare senza questo.
Penso che ho due problemi, ma non ho le conoscenze per risolverli.
PRIMO: devo creare diversi BST cognome per ogni nodo cognome e penso che non lo faccio, ma non so come fare ...
Eventuali suggerimenti?













