このコードは、コードに厳密に基づいていますが(ただし、SSCCEに拡張されています)、次の出力を生成します。
1 2 7 8 3 6 4 5 9 12 10 11
このコードは、C99の指定された初期化機能(C99への最も便利な追加機能の1つであるIMNSHO)を使用しています。myStruct
構造よりも「より良い」名前を使用することを選択しました。それは木を表すので、それはそれが呼ばれるものです。また、typedefでポインターを非表示にせず、印刷コードをconst-correctにしました(印刷コードは通常、操作しているデータ構造を変更しないはずです)。また、C99オプションを使用して、for
ループの最初の句で変数を宣言します。printTree()
ルートノードからデータを出力し、yourを呼び出してprintBFS()
ツリーの本体を印刷し、出力の終わりを示す改行を出力する追加の関数を導入しました。このprintTree()
関数は、ツリーを印刷するために呼び出されます。の体系的な使用に注意してくださいprintData()
ノードのデータを出力します。データが単一の整数よりも複雑な場合、これにより、印刷コードを1回記述することができます。
コードを注意深く調べると、printBFS()
以下が表示内容と同型であることがわかります。これは、表示するコードに問題がないことを示しています。つまり、ツリーの印刷に使用されるコードではなく、ツリーの構築に使用するコードに含まれている可能性があります。ツリー構築コードを表示していないため、問題が何であるかを予測するのが難しくなります。
#include <stdio.h>
#include <assert.h>
enum { MAX_CHILDREN = 3 };
typedef struct Tree Tree;
struct Tree
{
int data;
int number_of_children;
Tree *children[MAX_CHILDREN];
};
static void printData(const Tree *s)
{
printf(" %d", s->data);
}
static void printAllChildrenData(const Tree *s)
{
for (int i = 0; i < s->number_of_children; i++)
printData(s->children[i]);
}
static const Tree *getChildAtIndex(const Tree *s, int i)
{
assert(s != 0 && i >= 0 && i < s->number_of_children);
return(s->children[i]);
}
static void printBFS(const Tree *s)
{
printAllChildrenData(s);
for (int i = 0; i < s->number_of_children; i++)
{
const Tree *childCurr = getChildAtIndex(s, i);
printBFS(childCurr);
}
}
static void printTree(const Tree *s)
{
printData(s);
printBFS(s);
putchar('\n');
}
/*
** 1
** 2 7 8
** 3 6 9 12
** 4 5 10 11
*/
static Tree nodes[] =
{
[ 1] = { 1, 3, { &nodes[ 2], &nodes[ 7], &nodes[ 8] } },
[ 2] = { 2, 2, { &nodes[ 3], &nodes[ 6], 0 } },
[ 3] = { 3, 2, { &nodes[ 4], &nodes[ 5], 0 } },
[ 4] = { 4, 0, { 0, 0, 0 } },
[ 5] = { 5, 0, { 0, 0, 0 } },
[ 6] = { 6, 0, { 0, 0, 0 } },
[ 7] = { 7, 0, { 0, 0, 0 } },
[ 8] = { 8, 2, { &nodes[ 9], &nodes[12], 0 } },
[ 9] = { 9, 2, { &nodes[10], &nodes[11], 0 } },
[10] = { 10, 0, { 0, 0, 0 } },
[11] = { 11, 0, { 0, 0, 0 } },
[12] = { 12, 0, { 0, 0, 0 } },
};
int main(void)
{
printTree(&nodes[1]);
return(0);
}
テストを簡単に修正して、各ノードを順番に印刷できます。
enum { NUM_NODES = sizeof(nodes) / sizeof(nodes[0]) } ;
int main(void)
{
for (int i = 1; i < NUM_NODES; i++)
printTree(&nodes[i]);
return(0);
}