0

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

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

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

}
4

3 回答 3

1

我想我理解你想要达到的目标,但是:这个

typedef struct node thenode;

定义用户类型,这意味着,您没有声明结构节点类型的变量,而是声明了新类型,即结构节点。

这个

thenode *objectname = NULL;

不会将节点的内部变量对象名设置为 NULL,这会声明一个新指针,指向您之前定义的节点类型的变量。

这个

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);
   ...
}
于 2012-12-09T17:52:23.713 回答
1

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

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

    A
   / \
  B   C
 / \
D   E

代表树的数组如下所示:

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

对于数组 position 中的每个节点n,左孩子将位于 position (2n + 1),右孩子将位于(2n + 2).

所以,给定你的树——你大概已经创建了,也许是手工创建的——你会确切地知道在数组中放置每个节点 ( tree[n] = struct node) 的位置,并且你可以轻松地遍历它。您甚至可以有一个文件,其中每一行都是树的一个“节点”,并且行号与数组位置相同。

祝你好运!

于 2012-12-09T17:44:32.657 回答
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;
}
于 2012-12-09T18:20:48.703 回答