0

ここで実現したいプログラムは、ハードコーディングしてツリーを構築し、ハードコードツリーを印刷することです。オブジェクト名、質問、および同じ構造体を指すyesまたはnoノードを含む構造体から始めます。mainメソッドでは、構造体を段階的に構築しようとしました。しかし、それはノードを使用してツリーを作成する正しい方法ではないと思います。

私のデザインの説明:それはコンピューターとユーザーの間のゲームであり、コンピューターが質問をし、ユーザーが「はい」または「いいえ」で答えると、コンピューターがオブジェクトを推測します。

                  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;

ノードの内部変数objectnameをNULLに設定しません。これにより、以前に定義したノード型の変数への新しいポインターが宣言されます。

これ

struct node *ptr = &thenode;

ノードへの新しいポインタを宣言し、!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)が、ツリー自体のコーディングがより簡単になると思います。後で実際の「ツリー」構造にリファクタリングすることができます。

あなたはこれを行う方法を説明しているインターネット上のたくさんの場所を見つけることができます。しかし、あなたがこのような木を持っているとしましょう:

    A
   / \
  B   C
 / \
D   E

ツリーを表す配列は次のようになります。

ツリー=[A、B、C、D、E]

n配列の位置にあるノードごとに、左側の子が所定の位置に配置され(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 に答える