Jeg har en lekser som spør meg for å lage en struct av binært søketre der dens node i binært søketre er et annet binært søketre. Den første BST har etternavn av studenter og den andre har de første navnene og id. Også hvis noen har samme etternavn med en annen student må jeg ikke opprette en ny etternavn node, men jeg må lage inne i eksisterende etternavn node annen fornavn og Id node. For å være mer presis:
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;
Mitt største problem er hvordan man skal skape en annen nameANDid node for hver fornavn jeg fant fordi med følgende kode jeg lage to BST en for etternavn og en annen for de navnene, men jeg ønsker å være som for eksempel: Hvis jeg har disse elevene
Stallone Sylvester 11111111
Stallone Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Hogan Daniel 55555555
Jeg ønsker å lagre dem slik: .........
Stallone Sylvester 11111111
Noah 22222222
Norris Chuck 33333333
Hogan Hulk 44444444
Daniel 55555555
I stedet for dette tar jeg noe sånt som: ...........
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
Jeg vil sette her noen funksjoner for å være mer spesifikk
Lasten funksjonen laster navnene fra en txt dokument.
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);
}
hvor
struct node temp;//just a node pointer
struct node *top=NULL; //shows the top of the tree
Den Addnode funksjonen er: ...
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;
}
Og add_node_nameANDid () -funksjonen er som forrige funksjon, men den har noen variabler endret:
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;
}
Sorry for den enorme kildekoden som jeg bare laste, men det ville være svært vanskelig å forklare uten dette.
Jeg tror at jeg har to problemer, men jeg har ikke kunnskap til å løse dem.
FØRST: Jeg må lage forskjellige fornavn BST for hver etternavn node, og jeg tror at jeg ikke gjør det, men jeg vet ikke hvordan du gjør det ...
Noen forslag?













