Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2981 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Les Arbres

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Les Arbres

n°1835879
manchester​23
Posté le 09-01-2009 à 11:24:31  profilanswer
 

salut ,
j'ai essayer de faire un programme qui recherche une valeur dans un arbre,  
Normalement il me retourn l'adresse de la valeur a rechercher si trouver.
je ne sais pas pourquoi ne sa marche pas. Merci pour votre aide ;)

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /*******************declaration de l'arbre*********************/
  4. typedef struct elt{ int info;
  5.                     struct elt *succ_gauche,*succ_droit;
  6.                     }arbre;
  7. /*******************Les primitives*********************/
  8. int arbre_vide(arbre *a)
  9. {
  10.     if(a==NULL)
  11.         return 1;
  12.     else
  13.         return 0;
  14. }
  15. int feuille(arbre *a)
  16. {
  17.     if(a->succ_droit==a->succ_gauche==NULL)
  18.         return 1;
  19.     else
  20.         return 0;
  21. }
  22. arbre *fils_gauche(arbre *a)
  23. {
  24.     return(a->succ_gauche);
  25. }
  26. arbre *fils_droite(arbre *a)
  27. {
  28.     return(a->succ_droit);
  29. }
  30. /*******************Insertion*********************/
  31. void insere(arbre *a, int val, arbre **pere)
  32. {
  33.     arbre *p;
  34.     if(!arbre_vide(a))
  35.     {
  36.         if(val==a->info)
  37.           return;
  38.         else
  39.         {
  40.             *pere=a;
  41.             if(a->info>val)
  42.                 insere(fils_gauche(a),val,&pere);
  43.             else
  44.                 insere(fils_droite(a),val,&pere);
  45.         }
  46.     }
  47.     else
  48.     {
  49.        p=(arbre*)malloc(sizeof(arbre));
  50.        p->info=val;
  51.        p->succ_gauche=p->succ_droit=NULL;
  52.        if((*pere)->info>val)
  53.        (*pere)->succ_gauche=p;
  54.        else
  55.        (*pere)->succ_droit=p;
  56.     }
  57. }
  58. /****************La Recherche*******************/
  59. arbre* recherche(arbre *a, int val)
  60. {
  61.     arbre *adr=NULL;
  62.     if(!arbre_vide(a))
  63.     {
  64.         if(a->info==val) adr=a;
  65.         else if(!feuille(a))
  66.         {
  67.             if(a->info >val)
  68.                 recherche(fils_gauche(a),val);
  69.             else
  70.                 recherche(fils_droite(a),val);
  71.         }
  72.     }
  73.     return (adr);
  74. }
  75. /******************* Main()*********************/
  76. int main(void)
  77. {
  78.     arbre *racine,*pere,*adr=NULL,*k;
  79.     int n,val,i,x;
  80.     printf("\ncombien de nombre vous voulez entrer:   " );
  81.     scanf("%d",&n);
  82.     printf("\ndonner la premier valeur:   " );
  83.     scanf("%d",&val);
  84.     racine=(arbre*)malloc(sizeof(arbre));
  85.     racine->info=val;
  86.     racine->succ_gauche=racine->succ_droit=NULL;
  87.     for(i=1; i<n; i++)
  88.     {
  89.         printf("\ndonner un nombre:  " );
  90.         pere=NULL;
  91.         printf("%d ",racine->info);
  92.         insere(racine,val,&pere);
  93.     }
  94.     printf("\n donner une valeur a chercher:" );
  95.     scanf("%d",&x);
  96.     adr=recherche(racine,x);
  97.     if(adr!=NULL)
  98.         printf("la valeur existe l'adresse est %d",adr);
  99.     else
  100.         printf("Votre valeur n'existe pas" );
  101. }

mood
Publicité
Posté le 09-01-2009 à 11:24:31  profilanswer
 

n°1836097
Trap D
Posté le 09-01-2009 à 17:00:25  profilanswer
 

Dans ta fonction recherche tu ne récupère pas le retour des fonctions recherche(fils_gauche(a),val); et recherche(fils_doit(a),val); donc évidemment 2 fois sur trois tu retournes NULL.
Tu as des warnings à la compilation dont tu devrais tenir compte :
Ceci     if(a->succ_droit==a->succ_gauche==NULL) ne fais pas ce que tu penses :
il faut écrire if (a->succ_droit== NULL && a->succ_gauche==NULL)

 

De même ici :
              if(a->info>val)
                  insere(fils_gauche(a),val,&pere);
              else
                  insere(fils_droite(a),val,&pere);
il faut écrire

 

             if(a->info>val)
                  insere(fils_gauche(a),val,pere);
              else
                  insere(fils_droite(a),val,pere);

 


Message édité par Trap D le 09-01-2009 à 17:12:41
n°1836147
manchester​23
Posté le 09-01-2009 à 18:26:20  profilanswer
 

Oui c'est vrai j'ai pas remarqué que je ne récupére pas les adresses lol. Merci Bien Trap D.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Les Arbres

 

Sujets relatifs
[C]Arbres et seg faultLes arbres programmatique
Arbres 2-3[Arbres] Logiciel de dessin
Aides sur les arbres n-aires[XML] XML encryption : cryptage d'arbres XML
[ALGO/SQL] Gérer les arbres en SQL[SQL] Algèbre relationnelle, arbres algèbriques et SQL [resolu]
[structure] Comment représenter des arbres ?Recherche des exemples de code en C sur les arbres
Plus de sujets relatifs à : Les Arbres


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR