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
到编译器)。您不应该在末尾释放分配的空间吗?不要在箭头->
或点
操作符周围留下空格;它们绑定得非常非常紧密,这应该反映在源代码中。您也不能在尝试时执行字符串赋值;您所做的是复制超出数组边界的数据(不好!)。