2012-12-09 26 views
0

該計劃是建立硬編碼的一棵樹,然後打印出硬代碼樹。我從一個結構開始,它包含一個對象名稱,一個問題以及指向同一結構的是或否節點。在主要方法中,我試圖一步一步構建結構。但我相信這不是用節點創建樹的正確方法。C語言創建樹節點,硬編碼,我想在這裏實現樹

我的設計說明:它是計算機和用戶之間的遊戲,計算機詢問問題,然後用戶回答是或否,計算機會猜測該對象。

    Start here 
         | 
         v 
       Does it have a tail? 
      /yes    no\ 
      v      v 
     a pangolin   Is it flat, round and edible? 
           /yes    no\ 
          v      v 
         a pizza     Pete 




#include <stdio.h> 
#include <stdlib.h> 
//object name as key, questions as value 
struct node { 
    char *objectname;// a string declaration to hold an object-name (which may be NULL) 
    char *question;// a string declaration to hold a question (which may be NULL) 
    struct node *yes_ptr; // only NULL for objects 
    struct node *no_ptr; // only NULL for objects 

}; 

typedef struct node thenode; 

thenode *objectname = NULL; 
thenode *question =NULL; 

void nodePrint(struct node *ptr){ 

if(ptr->objectname == NULL) 
{ 
    printf("Object : [NOTHING]"); 
    printf("Question : %s", ptr->question); 
    printf("Yes : &s", ptr->yes_ptr); 
    printf("No : &s", ptr->no_ptr); 

}else { 
    printf("Object : %s", ptr->objectname); 
    printf("Question : [NOTHING]"); 
} 
} 

int main(argc, **argv){ 
//if ((new_obj = malloc(sizeof(thenode))) == NULL) { abort(); } 

thenode a={NULL, "Does it have a tail?", "a pangolin", "pete"}; 
thenode b={"a pizza",NULL, NULL, NULL}; 
//thenode c={NULL, "Is it flat, round and edible?", "a pizza", "pete"}; 
//thenode c={NULL, "Can you dip it in your tea? ", "biscuit", "a pizza"}; 
struct node *ptr = &thenode; 
nodePrint(&a); 
nodePrint(&b); 

} 

回答

1

你可以把「不變」的數據在陣列中,其中包括三分球。

thenode thenodes[] = 
/* 0 */ {{ NULL, "Does it have a tail?", thenodes+1,thenodes+2} 
/* 1 */ ,{ "a pangolin", NULL,NULL,NULL} 
/* 2 */ ,{ NULL, "Is it flat, round and edible?", thenodes+3 , thenodes+4 } 
/* 3 */ ,{"a pizza",NULL, NULL, NULL} 
/* 4 */ ,{ "pete", NULL,NULL,NULL} 
     }; 

void nodePrint(struct node *ptr){ 

if (!ptr) return; 
    printf("{"); 
if (ptr->objectname == NULL) { 
    printf("Object : [NOTHING]"); 
    printf("Question : %s", ptr->question); 
    printf("Yes : "); nodePrint(ptr->yes_ptr); 
    printf("No : "); nodePrint(ptr->no_ptr); 

    }else { 
    printf("Object : %s", ptr->objectname); 
    printf("Question : [NOTHING]"); 
    } 
    printf("}"); 
} 

int main(int argc, char **argv){ 
struct node *ptr = thenodes; 

nodePrint(ptr); 

return 0; 
} 
1

您可能會考慮將您的樹實現爲一個數組!這種方案會佔用更多的內存(的2^n數組大小,而不是一組大小n的指針),不過,我懷疑編碼樹本身將變得更簡單。稍後您可以將其重構爲實際的「樹」結構。

你可以在互聯網上找到很多地方描述如何做到這一點。但是,假設你有一個這樣的樹:

A 
/\ 
    B C 
/\ 
D E 

表示樹看起來像這樣你的數組:

樹= [A,B,C,d,E]

對於每個節點在陣列的位置n中,左邊的孩子將位於(2n + 1)的位置,右邊的孩子將位於(2n + 2)

因此,考慮到你的樹 - 你大概已經創建了,或許是手工創建的 - 你會準確知道數組中的哪個位置來放置每個節點(tree[n] = struct node),並且您可以輕鬆地遍歷它。你甚至可以有一個文件,其中每行是樹的「節點」,而行數是一樣的排列位置。

祝你好運!

1

我想我明白你想實現什麼,但是: 這個

typedef struct node thenode; 

定義用戶類型,這意味着,你不聲明類型結構節點的變量,但你正在申報的新類型的IS結構節點。

thenode *objectname = NULL; 

不設置thenode的內可變對象名到NULL,此聲明新的指針,該之前定義類型thenode的變量。

struct node *ptr = &thenode; 

聲明瞭一個新的指針到節點,並分配!類型的地址!然後去它。 (我衷心希望這不是可編譯的)。

我建議尋找一些教程描述C.動態內存分配應該是這樣的:

typedef struct { 
    ... 
} 
thenode; 

int main() { 
    thenode *node; 
    ... 
    if ((node = malloc(sizeof(thenode))) == NULL) fail_somehow(); 
    ... 
    node->something = something; 
    ... 
    free(node); 
    ... 
}