2013-11-21 7 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) Вы должны инициализировать root в NULL, в противном случае она может содержать любое значение мусора и строительство ваше дерево может выйти из строя при первом вызове.

treeNode *root = NULL; 

2) Вы назначаете только один char из singerName и albumTitle, и оба из оценок (допустимые индексы являются 0 ... 49). Для того, чтобы скопировать фактические строки, используйте strcpy:

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

3) В случае releaseYear одинаков для двух узлов, код просто теряет новый узел, потому что он даже не создан. Удалите окончательный else в addAlbum и удалить условие из первых (теперь только) 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) Ваши printf звонки в main просто распечатайте значения мусора неинициализированных локальных переменных. Удалите все остальные локальные переменные, кроме root от main. Внедрить обход дерева для печати сохраненных в нем значений.

Смежные вопросы