在c中创建树节点,硬编码树

时间:2012-12-09 17:32:31

标签: c

我想在这里实现的程序是通过硬编码构造树,然后打印出硬代码树。我从一个结构开始,该结构包含一个对象名称,一个问题,以及指向同一结构的是或否节点。在main方法中,我尝试逐步构造struct。但我认为这不是用节点创建树的正确方法。

我的设计描述:它是计算机和用户之间的游戏,计算机询问问题,然后用户回答是或否,计算机将猜测对象。

                  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);

}

3 个答案:

答案 0 :(得分:1)

您可以考虑将树实现为数组!此方案将占用更多内存(数组大小为2^n而不是一组大小为n的指针),但是,我怀疑编码树本身会变得更简单。您可以稍后将其重构为实际的“树”结构。

您可以在互联网上找到很多描述如何执行此操作的地方。但是说你有一棵这样的树:

    A
   / \
  B   C
 / \
D   E

表示树的数组如下所示:

tree = [A,B,C,D,E]

对于数组位置n中的每个节点,左边的子节点位于(2n + 1)位置,右边的子节点位于(2n + 2)

所以,鉴于你的树 - 你可能已经创建了,也许是手工制作 - 你会确切地知道数组在每个节点(tree[n] = struct node)放置的位置,你很容易就可以遍历它。你甚至可以有一个文件,其中每一行都是树的“节点”,行号与数组位置相同。

祝你好运!

答案 1 :(得分:1)

我想我明白你想要达到的目标,但是: 此

typedef struct node thenode;

定义用户类型,这意味着,您没有声明struct node类型的变量,但是您声明了新的类型是哪个IS结构节点。

thenode *objectname = NULL;

没有将thenode的内部变量objectname设置为NULL,这声明了一个新的指针,指向你之前定义的类型thenode的变量。

struct node *ptr = &thenode;

声明一个指向node的新指针并指定!type的地址!然后去了它。 (我真诚地希望这不可编辑)。

我建议查看一些描述C中动态内存分配的教程。它应该如下所示:

typedef struct {
   ...
}
thenode;

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

答案 2 :(得分: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;
}