begin process at 2008 07 04 11:58:51
1 204 587 membres
128 nouveaux aujourd'hui
14 116 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Arbre dictionnaire [ Archives / Maths & Algorithmes ] (Toto_15l)

Arbre dictionnaire le 06/04/2005 12:38:53

Toto_15l

Bonjour a tous je n'ai trouvé cette question nulle part alors je me décide à la poser, j'espere vous pourrez m'aider ...

Je dois construire un arbre dictionnaire mais je ne sais pas du tout comment m'y prendre  ...
Petite précision je dois le faire en language C et on doit pouvoir créer modifier ou supprimer des mots ainsi qu'en faire une recherche.

Merci de vos réponses et si jamais j'ai oublié de préciser quelque chose faite moi isgne svp.

Bonne continuation a tous.



Re : Arbre dictionnaire le 17/04/2005 15:42:35

julienbj
Définition de la structure représentant l'arbre:
typedef struct s_arbre
{
    struct s_arbre *droite, *gauche;
    char *info;
} t_arbre;
On utilisera un pointeur sur l'arbre que l'on nommera arbre.
On considèrera que l'arbre est ordonné avec la relation suivante:
arbre->gauche->info < arbre->info<=arbre->droite->info

Fonction de recherche dans l'arbre:
int recherche(t_arbre *arbre, char *chaine)
{
    if (arbre == NULL)
          return NULL;
    else if (stricmp(arbre->info, chaine) == 0)
          return 1;
    else if (stricmp(arbre->info, chaine) < 0)
          return recherche(arbre->droite, chaine);
    else
          return recherche(arbre->gauche, chaine);
}

Insertion d'un élément de façon ordonné:
void CreerFeuille(char *chaine, t_arbre **arbre)
{
    *arbre = (t_arbre*) malloc(1 * sizeof(t_arbre));
    //Regarder si strlen + 1 ou seulement strlen, je m'en rappelle jamais
    (*arbre)->info = (char*) malloc((strlen(chaine) + 1)*sizeof(char));
    strcpy((*arbre)->info, chaine);
    (*arbre)->gauche = NULL;
    (*arbre)->droite = NULL;
}
 void Insertion(t_arbre **arbre, char *chaine)
{
    if (*arbre == NULL)
       CreerFeuille(chaine, arbre);
    else if (stricmp(chaine, (*arbre)->info) >= 0)
       Insertion((*arbre)->droite, chaine);
    else
       Insertion((*arbre)->gauche, chaine);
}

Suppression d'un élément:
void SupprimerNoeud(t_arbre **arbre)
{
    t_arbre *p, *q;

    p = *arbre;
    if ((*arbre)->droite)
    {
       q = (*arbre)->droite;
       while (q->gauche)
              q = q->gauche;
       q->gauche = p->gauche;
       (*arbre) = (*arbre)->gauche;
    }
    else
       (*arbre) = (*arbre)->gauche;
    free(p->info);
    free(p);
}
void Supprimer(t_arbre **arbre, char *chaine)
{
    if (*arbre)
   {
          if (stricmp((*arbre)->info, chaine) == 0)
                SupprimerNoeud(arbre);
          else if (stricmp((*arbre)->info, chaine) > 0)
                Supprimer(&((*arbre)->gauche), chaine);
          else
                Supprimer(&((*arbre)->droite), chaine);
    }
}

Voila, je pense que ça devrait marcher!
Le seul doute reste sur les tests de stricmp ou il faut tester pour voir si ils sont dans le bon sens, mais j'y ai fait attention, et ça devrait aller!

C'est de la traduction en C d'un prog pascal, alors si il y a problème de pointeur, tu essaies d'adapter, le principe est la!

Vive le C
Tchao
Savon


Classé sous : arbre, dictionnaire

Participer à cet échange

Pub



Appels d'offres

Snippets en rapport

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS