У меня есть домашние задания, которые просят у меня, чтобы создать из-структуры бинарного дерева поиска, где его узел бинарного дерева поиска является еще одним бинарным деревом поиска. Первый BST имеет фамилии студентов, а другие имеют имена и идентификатор. Кроме того, если кто-то имеет такую же фамилию с другим студентом, я не должен создавать другую «фамилию» узел, но я должен создать внутри существующего узла «фамилия» другое «имя и Id» узла. Чтобы быть более конкретным:
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
Я поставлю здесь некоторые функции для того, чтобы быть более конкретным
Функция загрузки загружает имена из текстового документа.
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;
}
Извините за огромный исходный код, который я только загрузить, но это было бы очень трудно объяснить без этого.
Я думаю, что у меня есть две проблемы, но у меня нет знаний, чтобы решить их.
ПЕРВЫЙ: Я должен создавать различный ПгвЬЫат BST для каждого узла фамилии, и я думаю, что я не делаю это, но я не знаю, как это сделать ...
Какие-либо предложения?













