Έχω ένα σπίτι που ζητούν από μένα για να δημιουργήσετε ένα struct του δυαδικού δένδρου αναζήτησης, όπου ο κόμβος του δυαδικού δένδρου αναζήτησης είναι ένα άλλο δυαδικό δένδρο αναζήτησης. Η πρώτη BST έχει τα επώνυμα των Φοιτητών και ο άλλος έχει τα πρώτα ονόματα και ταυτότητα. Επίσης, αν κάποιος έχει το ίδιο επώνυμο με ένα άλλο μαθητή δεν πρέπει να δημιουργήσει ένα άλλο «επώνυμο» κόμβος, αλλά έχω να δημιουργήσουν μέσα στο υπάρχον κόμβο «επώνυμο» άλλο «όνομα και ταυτότητα» του κόμβου. Για να γινω πιο συγκεκριμενη:
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;
κύριο πρόβλημά μου είναι πώς να δημιουργήσετε ένα διαφορετικό κόμβο nameANDid για κάθε firstname βρήκα γιατί με τον κωδικό μπορώ να δημιουργήσω 2 ένα BST για τα επώνυμα και ένα άλλο για τα ονόματα, αλλά θα ήθελα να είναι όπως, για παράδειγμα: Αν έχω αυτούς τους φοιτητές
Stallone Sylvester 11111111
Stallone Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Hogan Daniel 55555555
Θέλω να τα αποθηκεύσετε ως εξής: .........
Stallone Sylvester 11111111
Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Daniel 55555555
Αντί γι 'αυτό παίρνω κάτι σαν: ...........
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
Θα βάλω εδώ μερικές λειτουργίες για να γίνω πιο συγκεκριμένος
Η λειτουργία του φορτίου φορτώνει τα ονόματα από ένα έγγραφο 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);
}
όπου
struct node temp;//just a node pointer
struct node *top=NULL; //shows the top of the tree
Η λειτουργία 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;
}
Και η add_node_nameANDid () συνάρτηση είναι σαν την προηγούμενη λειτουργία, αλλά έχει κάποιες μεταβλητές αλλάξει:
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;
}
Συγγνώμη για το τεράστιο πηγαίο κώδικα που μόλις φορτώσετε αλλά θα ήταν πολύ δύσκολο να εξηγήσουμε χωρίς αυτό.
Νομίζω ότι έχω δύο προβλήματα, αλλά δεν έχω τις γνώσεις για την επίλυσή τους.
ΠΡΩΤΟ: Πρέπει να δημιουργήσετε διαφορετικά firstname BST για κάθε κόμβο επώνυμο και νομίζω ότι δεν το κάνουμε αυτό, αλλά δεν ξέρω πώς να το κάνουμε αυτό ...
Οποιεσδήποτε προτάσεις?













