Mám úkol, který mě požádat vytvořit struct binárního vyhledávacího stromu, kde jeho uzel binárního vyhledávacího stromu je další binární vyhledávací strom. První BST má příjmení studentů a druhý má křestní jména a id. Také pokud někdo má stejné příjmení s jiným studentem Nesmím vytvořit další „příjmení“ uzel, ale musím vytvořit uvnitř stávajícího „příjmení“ uzel další „křestní jméno a ID“ uzel. Byt více specifický:
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;
Mým hlavním problémem je, jak vytvořit různé nameANDid uzel pro každou křestní jméno, protože jsem našel následující kód tvořím 2 BST jeden pro příjmení a jiný pro názvy, ale chtěl bych být jako například: Mám-li tyto studenty
Stallone Sylvester 11111111
Stallone Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Hogan Daniel 55555555
Chci ukládat takto: .........
Stallone Sylvester 11111111
Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Daniel 55555555
Namísto toho jsem si něco jako: ...........
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
Vložím zde některé funkce, aby byl konkrétnější
Funkce load načte jména z TXT dokumentu.
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);
}
kde
struct node temp;//just a node pointer
struct node *top=NULL; //shows the top of the tree
Funkce AddNode je: ...
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;
}
A add_node_nameANDid () funkce je podobně jako předchozí funkce, ale má některé proměnné změnilo:
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;
}
Omlouváme se za obrovské zdrojový kód, který jsem jen nahrát, ale to by bylo velmi obtížné vysvětlit, aniž by to.
Myslím, že mám dva problémy, ale nemám znalosti, aby jejich řešení.
PRVNÍ: Mám vytvořit jiný FIRSTNAME BST pro každý uzel příjmení a myslím, že nemám dělat to, ale nevím, jak to udělat ...
Nějaké návrhy?













