【发布时间】:2023-03-08 04:11:01
【问题描述】:
我有一个作业要求我创建一个二叉搜索树的结构,其中二叉搜索树的节点是另一个二叉搜索树。第一个 BST 有学生的姓氏,另一个有名字和 id。此外,如果某人与另一个学生具有相同的姓氏,我不能创建另一个“姓氏”节点,但我必须在现有的“姓氏”节点内创建另一个“名字和 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 节点,因为使用以下代码我为姓氏和另一个名字创建了 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;
}
抱歉,我刚刚上传了巨大的源代码,但如果没有这个,将很难解释。
我认为我有两个问题,但我没有解决它们的知识。
FIRST:我必须为每个姓氏节点创建不同的名字 BST,我认为我不这样做,但我不知道该怎么做......
有什么建议吗?
【问题讨论】:
-
噢!好问题..................................
-
你编译过这段代码吗?它似乎充满了无法编译的错误。
-
您应该更具体,隔离问题并仅发布问题源代码和问题。这太长了..
-
是的,我做到了,它编译没有任何错误......它也运行没有崩溃..
-
我删除了一些行,但我不能全部删除,否则你将无法理解代码。我的问题是如何为主树的每个“姓氏”节点创建新的 BST“名称”,而不是创建 2 个二叉搜索树(1 个用于姓氏,1 个用于名称)。请参阅我给出的示例。
标签: c pointers binary-search-tree