C 二叉搜索树插入

C 二叉搜索树插入,c,C,我只想在二进制搜索树中添加相册,但该树将根据发布年份构建。我写的代码,但它没有运行 #include<stdio.h> #include<stdlib.h> typedef struct treeNode { int releaseYear; char singerName[50]; char albumTitle[50]; struct treeNode *left; struct treeNode *right; } tree

我只想在二进制搜索树中添加相册,但该树将根据发布年份构建。我写的代码,但它没有运行

#include<stdio.h>
#include<stdlib.h>

typedef struct treeNode {
    int releaseYear;
    char singerName[50];
    char albumTitle[50];
    struct treeNode *left;
    struct treeNode *right;
} treeNode;

treeNode *addAlbum(treeNode *node,int releaseYear,char singerName[50],char albumTitle[50]) {
    if(node==NULL) {
        treeNode *temp;
        temp=(treeNode *)malloc(sizeof(treeNode));
        temp -> releaseYear=releaseYear;
        temp -> singerName[50]=singerName[50];
        temp -> albumTitle[50]=albumTitle[50];
        temp ->left = NULL;
        temp ->right = NULL;
        return temp;
    }

    if(releaseYear > (node -> releaseYear)) {
        node ->right=addAlbum(node->right,releaseYear ,singerName,albumTitle);
    }
    else if(releaseYear<(node -> releaseYear)) {
        node ->left=addAlbum(node->left,releaseYear, singerName,albumTitle);
    }
    else {
        return node;
    }

}

int main() {
    treeNode *root;
    int releaseYear;
    char singerName[50];
    char albumTitle[50];
    root=addAlbum(root,1995,"a","d");
    root=addAlbum(root,1998,"b","c");
    printf("singers = s\n",singerName[50]);
    printf("albumTitles = %c\n",albumTitle[50]);
    printf("years = %d\n",releaseYear);
    return 0;
}
#包括
#包括
类型定义结构树节点{
国际发布年;
char singerName[50];
标题[50];
结构树节点*左;
结构树节点*右侧;
}三烯醇;
treeNode*addAlbum(treeNode*node,int releaseYear,char singerName[50],char albumTitle[50]){
if(node==NULL){
treeNode*温度;
temp=(treeNode*)malloc(sizeof(treeNode));
临时->发布年份=发布年份;
temp->singerName[50]=singerName[50];
temp->albumTitle[50]=albumTitle[50];
temp->left=NULL;
temp->right=NULL;
返回温度;
}
如果(releaseYear>(节点->releaseYear)){
node->right=addAlbum(node->right,releaseYear,singerName,albumTitle);
}
else if(releaseYear releaseYear)){
节点->左=添加相册(节点->左,发布年份,歌手姓名,相册标题);
}
否则{
返回节点;
}
}
int main(){
树根;
国际发布年;
char singerName[50];
标题[50];
root=addAlbum(root,1995年,“a”,“d”);
root=addAlbum(root,1998年,“b”,“c”);
printf(“singers=s\n”,singerName[50]);
printf(“albumTitles=%c\n”,albumTitle[50]);
printf(“年份=%d\n”,发布年份);
返回0;
}

存在许多问题:

1) 您必须将
root
初始化为
NULL
,否则它可能包含任何垃圾值,并且您的树的构造可能会在第一次调用时失败

treeNode *root = NULL;
2) 您只分配了
singerName
albumTitle
中的一个
char
,这两个都是超出范围的(有效数组索引为0…49)。要复制实际字符串,请使用strcpy:

strcpy(temp->singerName, singerName); // was: temp->singerName[50]=signerName[50];
strcpy(temp->albumTitle, albumTitle);
3) 如果两个节点的
releaseYear
相同,那么您的代码将丢失新节点,因为它甚至没有创建。在
addAlbum
中删除最后一个
else
,并从第一个(仅限现在)
else
中删除条件,如果在此调用过程中未创建新节点,则始终返回
节点

if (releaseYear > node->releaseYear) {
    node->right = addAlbum(node->right, releaseYear, singerName, albumTitle);
} else {
    node->left = addAlbum(node->left, releaseYear, singerName, albumTitle);
}
return node;

4) 您在
main
中调用的
printf
只是打印出未初始化的局部变量的垃圾值。从
main
中删除除
root
之外的所有其他局部变量。执行树遍历以打印其中存储的值。

请学习如何使用调试器…并在启用警告的情况下编译(
-Wall
到编译器)。您不应该在末尾释放分配的空间吗?不要在箭头
->
或点
操作符周围留下空格;它们绑定得非常非常紧密,这应该反映在源代码中。您也不能在尝试时执行字符串赋值;您所做的是复制超出数组边界的数据(不好!)。