2012-09-24 108 views
0

我在C語言中構建二叉樹時遇到了問題。我想能夠將書籍添加到樹中,在這些樹中隨後出版年份的書籍被添加到左側,並且早期出版年份被添加在右邊。我不斷收到運行錯誤,我不確定爲什麼。C中的二叉樹

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


struct book { 
    char* name; 
    int year; 
}; 

typedef struct tnode { 
    struct book *aBook; 
    struct tnode *left; 
    struct tnode *right; 
} BTree; 

BTree* addBook(BTree* nodeP, char* name, int year){ 
    if(nodeP == NULL) 
    { 
     nodeP = (struct tnode*) malloc(sizeof(struct tnode)); 
     (nodeP->aBook)->year = year; 
     (nodeP->aBook)->name = name; 
     /* initialize the children to null */ 
     (nodeP)->left = NULL;  
     (nodeP)->right = NULL; 
    } 
    else if(year > (nodeP->aBook)->year) 
    { 
     addBook(&(nodeP)->left,name,year); 
    } 
    else if(year < (nodeP->aBook)->year) 
    { 
     addBook(&(nodeP)->right,name,year); 
    } 
    return nodeP; 
} 

void freeBTree(BTree* books) 
{ 
    if(books != NULL) 
    { 
     freeBTree(books->left); 
     freeBTree(books->right); 
     //free(books); 
    } 
} 

void printBooks(BTree* books){ 
    if(books != NULL){ 

    } 
} 

int main(int argc, char** argv) { 
    BTree *head; 
    head = addBook(head,"The C Programming Language", 1990); 
    /*addBook(head,"JavaScript, The Good Parts",2008); 
    addBook(head,"Accelerated C++: Practical Programming by Example", 2000); 
    addBook(head,"Scala for the impatient",2012);*/ 
} 
+3

「我不斷收到運行錯誤」 - 懸念是殺害我.... –

+0

這可能是一個段錯誤。在這種情況下,用valgrind或類似的程序運行你的程序,你應該能夠正確地調試它。在開頭 –

+0

,頭指向隨機存儲器。嘗試'BTree * head = NULL;'然後開始添加書籍。 – esskar

回答

1

的一個問題是,你是不是初始化爲NULL:

BTree *head; 

應該

BTree *head = NULL; 

我建議設置你的編譯器警告高。你的兩個遞歸調用不正確,編譯器應該警告對他們:

addBook(&(nodeP)->left,name,year); 

應該是:

addBook(nodeP->left,name,year); 

從參數傳遞的立場。但是,由於當節點指針爲NULL時添加了這個函數,因此此函數將無法正常工作,這意味着您無法將父項附加到子項,因爲父指針節點已經消失。我認爲邏輯應該查看適用的右/左節點,如果爲NULL,則在該例程中直接添加,否則遞歸調用,直到找到具有NULL右/左指針的節點。

事情是這樣的:

BTree *makeNode(char *name, int year) 
{ 
    // NOTE: 3 frees required for every node 
    BTree *nodeP = malloc(sizeof(struct tnode)); // 1 
    nodeP->aBook = malloc(sizeof(struct book));  // 2 
    (nodeP->aBook)->year = year; 
    (nodeP->aBook)->name = malloc(strlen(name) + 1); // 3 
    strcpy((nodeP->aBook)->name,name); 
    /* initialize the children to null */ 
    nodeP->left = NULL;  
    nodeP->right = NULL; 
    return nodeP; 
} 

BTree* addBook(BTree* nodeP, char* name, int year) 
{ 
    if (nodeP == NULL) 
    { 
     nodeP = makeNode(name,year); 
    } 
    else if (year > (nodeP->aBook)->year) 
    { 
     if (nodeP->left == NULL) 
      nodeP->left = makeNode(name,year); 
     else 
      addBook(nodeP->left,name,year); 
    } 
    else if(year < (nodeP->aBook)->year) 
    { 
     if (nodeP->right == NULL) 
      nodeP->right = makeNode(name,year); 
     else 
      addBook(nodeP->right,name,year); 
    } 
    return nodeP; 
} 

void printBooks(BTree* books) 
{ 
    if (books != NULL) { 
     printf("book: %s %d\n",books->aBook->name,books->aBook->year); 
     printBooks(books->right); 
     printBooks(books->left); 
    } 
} 
2

你試圖訪問一個未初始化的指針nodeP->aBook

nodeP = (struct tnode*) malloc(sizeof(struct tnode)); 
(nodeP->aBook)->year = year; 
  • 你必須與malloc分配空間。或者,將數據直接存儲在節點(具有結構,而不是指向結構的指針)中。
+0

即時通訊新的c,所以我不確定這意味着什麼,但不是那個malloc聲明已經發生了什麼? – user1179321

+0

不,你只爲'struct tnode'分配空間,其中包含一個'struct book' *指針*,它最初包含一些垃圾(=指向內存中的某個隨機位置) 。 –