Am o temă care cere de la mine pentru a crea un struct de arbore binar de căutare în cazul în care nodul de arbore binar de căutare este un alt arbore binar de căutare. Primul BST are numele de familie al Studenților, iar cealaltă are primele nume și ID-ul. De asemenea, dacă cineva are același nume de familie cu un alt student nu trebuie să creeze un alt „nume“ nod, dar trebuie să creeze în interiorul nodului „numele“ existent alt „nume și ID-ul de“ nod. Pentru a fi mai specific:
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;
Principala mea problema este modul de a crea un nod nameANDid diferit pentru fiecare firstname am găsit că, cu următorul cod am crea 2 unul BST pentru numele de familie și un altul pentru nume, dar aș dori să fiu ca de exemplu: Dacă am acești studenți
Stallone Sylvester 11111111
Stallone Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Hogan Daniel 55555555
Vreau să le stocați așa: .........
Stallone Sylvester 11111111
Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Daniel 55555555
În loc de acest lucru eu iau ceva de genul: ...........
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
Voi pune aici unele funcții pentru a fi mai specific
Funcția de încărcare încarcă numele dintr-un document 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);
}
Unde
struct node temp;//just a node pointer
struct node *top=NULL; //shows the top of the tree
Funcția addNode este: ...
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;
}
Și add_node_nameANDid () funcția este ca funcția anterioară, dar are unele variabile schimbat:
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;
}
Ne pare rău pentru codul sursă imens pe care tocmai l-am încărcat, dar ar fi foarte dificil de explicat fără ca acest lucru.
Cred că am două probleme, dar nu am cunoștințele necesare pentru a le rezolva.
PRIMUL: Trebuie să creeze diferite BST firstname pentru fiecare nod nume de familie și cred că eu nu fac asta, dar eu nu știu cum să fac asta ...
Orice sugestii?













