此代码密切基于您的代码(但扩展为SSCCE),产生输出:
1 2 7 8 3 6 4 5 9 12 10 11
该代码使用 C99 的指定初始化程序功能(C99 最有用的补充之一,IMNSHO)。我选择使用比myStruct
结构“更好”的名称;它代表一棵树,所以这就是它的名称。我也没有在 typedef 中隐藏指针,并使打印代码 const 正确(打印代码通常不应该修改它正在操作的数据结构)。它还使用 C99 选项在for
循环的第一个子句中声明一个变量。我引入了一个额外的函数,printTree()
它从根节点打印数据,调用 yourprintBFS()
来打印树的主体,并打印一个换行符来标记输出的结束;调用该printTree()
函数来打印一棵树。注意系统的使用printData()
打印节点的数据。如果数据比单个整数更复杂,这将允许您编写一次打印代码。
仔细研究代码会发现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);
}