2013-11-21 169 views
-2

我只是想在二叉搜索樹中addAlbum,但樹會根據發佈年份構建。我寫的代碼,但它不運行...二叉搜索樹插入

#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; 
} 
+0

請了解如何使用調試器。 –

+0

...並編譯並啓用警告('-Wall'到編譯器)。 – Arkku

+0

你不應該在最後釋放分配的空間嗎? – kero

回答

2

有許多的問題:

1)您必須初始化rootNULL,否則它可能包含任何價值的垃圾和建設您的樹可能會在第一次通話時失敗。

treeNode *root = NULL; 

2)你僅分配一個charsingerNamealbumTitle,又都是出界(所述有效陣列索引是0 ... 49)。要複製實際的字符串,請使用strcpy

strcpy(temp->singerName, singerName); // was: temp->singerName[50]=signerName[50]; 
strcpy(temp->albumTitle, albumTitle); 

3)如果releaseYear是兩個節點是相同的,你的代碼只需失去了新的節點,因爲它甚至沒有創建。在addAlbum刪除最後else,並從第一刪除條件(現在只)else,並始終返回node,如果你沒有創建這個通話過程中一個新問題:

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

4)您的來電printfmain只是打印出未初始化的局部變量的垃圾值。從main刪除除root之外的所有其他局部變量。實現遍歷樹來打印存儲在其中的值。