我创建了一个函数,该函数应该在参数中获取二叉树,在用户输入中输入文件名,并在该文件内部打印二叉树,以便稍后通过graphviz转换为图片。
提供的二叉树类型为:
struct noeud_s;
typedef struct noeud_s noeud;
typedef noeud* arbre;
struct noeud_s{
char* valeur;
arbre gauche;
arbre droit;
};
我创建的2个函数是:
void create_dot(arbre racine)
{
FILE *f;
char file_name[100];
printf ("Nom du fichier a creer (Ajouter .dot a la fin): ");
scanf ("%s", file_name);
printf("Name: %s\n", file_name);
printf ("Creation du fichier dot\n");
f = fopen(file_name, "w");
if (f == NULL)
{
printf("NULL\n");
}
fprintf(f, "digigraph tree {\n");
write_to_dot(f, racine);
fprintf(f, "}");
fclose(f);
}
void write_to_dot(FILE *f, arbre racine)
{
if (racine == NULL)
{
return;
}
if (racine != NULL)
{
fprintf(f, "%s -> %s [label = \"non\"]\n", racine -> valeur, racine -> gauche -> valeur);
fprintf(f, "%s -> %s [label = \"oui\"]\n", racine -> valeur, racine -> droit -> valeur);
write_to_dot(f, racine -> gauche);
write_to_dot(f, racine -> droit);
}
return;
}
就调试而言,我推断出我的分段错误发生在write_to_dot函数内部。但是由于我无法正确处理gdb,我希望您能帮助我找到细分错误并进行解释。
答案 0 :(得分:2)
代码正在打印出一棵二叉树。没有代码显示如何构造节点,但是在典型的二叉树中,叶节点具有NULL
左右子节点(或gauche
和droit
)。 / p>
函数write_to_dot
将在第一个叶子节点(如果不是在中间分支节点的空侧)失败,因为racine->gauche
和racine->droit
将是{{ 1}},但是它们仍然被取消引用-NULL
,没有进行任何检查。
虽然我没有所有代码,但至少对此条件进行测试将解决以下问题之一:
racine->gauche->valeur