【问题标题】:visualizing a binary tree (BST)可视化二叉树 (BST)
【发布时间】:2021-09-28 10:08:29
【问题描述】:

我在这个可视化二叉树的函数中有一些错误,首先我们必须以写入模式打开文件,然后在其中绘制树。 然后我们必须使用命令(它在代码中)生成(.png)文件,以便可视化我们的图片。 PS:在这段代码中,创建树(creer_arbre)和打印树(afficher_arbre)的部分工作得很好,但是当涉及到绘图功能(dessinnerarbre)时,程序就停止工作了。

void dessinArbre (Pointeur_ATib R, FILE* f, int* nbNil)//the function of drawing
{
    if (R != NULL)
    {  
        // Dessiner un arc vers le fils gauche
        if (Fg_ATib(R) != NULL)
        {  
            fprintf(f, "  \"%d\" -- \"%d\" \n", Info_ATib(R), Info_ATib(Fg_ATib(R)));
            
        }
        else
        {   
            fprintf(f, "  \"NIL%d\" [style=invis];\n", *nbNil);
            fprintf(f, "  \"%d\" -- \"NIL%d\" ", Info_ATib(R), (*nbNil)++);
            fprintf(f, " [style=invis];\n");
        }
       
        // Dessiner un fils NIL virtuel et invisible au milieu (pour une meilleure séparation des fils gauches et droits)
        fprintf(f, "  \"NIL%d\" [style=invis];\n", *nbNil);
        fprintf(f, "  \"%d\" -- \"NIL%d\" ", Info_ATib(R), (*nbNil)++);
        fprintf(f, " [style=invis];\n");
  
        // Dessiner un arc vers le fils droit
        if (Fd_ATib(R)!= NULL)
        { 
            fprintf(f, "  \"%d\" -- \"%d\" \n", Info_ATib(R), Info_ATib(Fd_ATib(R)));
        }
        else
        {
            fprintf(f, "  \"NIL%d\" [style=invis];\n", *nbNil);
            fprintf(f, "  \"%d\" -- \"NIL%d\" ", Info_ATib(R), (*nbNil)++);
            fprintf(f, " [style=invis];\n");
        }
 
        // Dessiner les sous-arbres gauche et droit
        dessinArbre(Fg_ATib(R), f, nbNil);
        dessinArbre(Fd_ATib(R), f, nbNil);
        
   }
}
int main(int argc, char *argv[]) //the main programme
    {
        FILE* f;
        char*nomf;
        int sortie;
        int nbNil=0;
        char*cmd;

     printf ( " %s", " Introduiser le nombre des elements dans l'arbre " ) ;
     scanf ( " %d", &N ) ;
    /* lecture de nombre des elments */
     Creer_arbre ( & P, & N ) ;
     Afficher ( & P ) ;
    //dessin du  notre arbre
    printf ("Dessin de l'arbre \n");
                    printf ("   ----------------- \n\n");
                    if (P == NULL)
                    {
                        printf ("> ERREUR : Arbre vide !");
                    }
                    else
                    {
                        sprintf(nomf, "arbre%d.dot", sortie);
                        f = fopen(nomf,"w");        // Ouverture du fichier en écriture.
                        fprintf(f, "graph arbre {\n");
                        fprintf(f, "\tordering = out;\n");
                        fprintf(f, "\tsplines = false;\n");
                        nbNil = 0;
                        dessinArbre(P, f, &nbNil);
                        fprintf(f, "}\n");
                        fclose(f);
                        sprintf(cmd, "dot -Tpng arbre%d.dot -o arbre%d.png", sortie);
                        system(cmd);
                        sprintf(cmd, "arbre%d.png", sortie);
                        system(cmd);
                        sortie++;
                        printf (">> L'arbre est dessine correctement !");
                    }

     // system("PAUSE");
     getchar();
      return 0;
    }

这是实现:

typedef struct Tib Type_Tib  ;
  typedef Type_Tib * Typestr_Tib ;
  typedef int Type1_Tib  ;
  typedef bool Type2_Tib  ;
  struct Tib
    {
      Type1_Tib Champ1 ;
      Type2_Tib Champ2 ;
    };

  Type1_Tib Struct1_Tib ( Typestr_Tib S)
    {
      return  S->Champ1 ;
    }

  Type2_Tib Struct2_Tib ( Typestr_Tib S)
    {
      return  S->Champ2 ;
    }

  void Aff_struct1_Tib ( Typestr_Tib S, Type1_Tib Val )
    {
       S->Champ1 = Val ;
    }

  void Aff_struct2_Tib ( Typestr_Tib S, Type2_Tib Val )
    {
       S->Champ2 = Val ;
    }


  /** Arbres de recherche binaire **/

  typedef Typestr_Tib Typeelem_ATib   ;
  typedef struct Noeud_ATib * Pointeur_ATib ;

  struct Noeud_ATib
    {
      Typeelem_ATib  Val ;
      Pointeur_ATib Fg ;
      Pointeur_ATib Fd ;
      Pointeur_ATib Pere ;
     } ;

【问题讨论】:

标签: c function binary-tree visualization draw


【解决方案1】:
char*nomf;
//...
    sprintf(nomf, "arbre%d.dot", sortie);

nomf 需要是指向适当大小的缓冲区的指针。一个简单的解决方法是将nomf 声明为char nomf[256]; 考虑使用调试器在运行时检查您的程序,一个不错的调试器会告诉您程序崩溃的确切位置。

【讨论】:

  • 最好总是使用snprintf()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 2012-05-13
  • 1970-01-01
  • 2013-01-08
相关资源
最近更新 更多