X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=TP6%2Farbres%2Farbre_n_aire%2Farbre_n_aire.c;h=163412d741e170032ee2d889e77ef1e235a51588;hb=5016b118716d7ce33ad81bfc246c7df97f2fbdf5;hp=bfed52c9dc89f0c26bb2cca9a57cbf4b04388f32;hpb=915495850ca055b20497568512c3e70a6b61a13c;p=Algorithmic_C.git diff --git a/TP6/arbres/arbre_n_aire/arbre_n_aire.c b/TP6/arbres/arbre_n_aire/arbre_n_aire.c index bfed52c..163412d 100644 --- a/TP6/arbres/arbre_n_aire/arbre_n_aire.c +++ b/TP6/arbres/arbre_n_aire/arbre_n_aire.c @@ -55,27 +55,28 @@ NOEUD *insere_fin(char *mot, int i) /* Insertion d'un mot dans l'arbre ******************************************/ /* (on respecte l'ordre lexicographique des freres)**************************/ -NOEUD *_insere(NOEUD * p, char *mot, int i) +NOEUD *insere(NOEUD * p, char *mot, int i) { /* i est l'indice de la lettre courante dans le mot */ if (p == NULL) { return insere_fin(mot, i); + } else if (p->lettre == mot[i]) { + if (mot[i] == '\0') { + p->fils = insere(p->fils, mot, i + 1); + } else { + printf("The word is already here\n"); + } + } else if (p->lettre > mot[i]) { + NOEUD *p1 = insere_fin(mot, i); + p1->frere = p; + p = p1; + } else { + p->frere = insere(p->frere, mot, i); } - if (mot[i] > p->lettre) { - return _insere(p->frere, mot, i); - } else if (mot[i] == p->lettre) { - return _insere(p->fils, mot, i + 1); - } else if (mot[i] < p->lettre) { - return _insere(p->fils, mot, i); - } -} - -NOEUD *insere(NOEUD * p, char *mot, int i) -{ - p = _insere(p, mot, i); return p; } + /*****************************************************************************/ /* Affichage par ordre alphabetique de tous les mots stockes dans l'arbre */ void affiche(NOEUD * p, char *mot, int i) @@ -93,7 +94,7 @@ void affiche(NOEUD * p, char *mot, int i) /* Visualisation de l'arbre n-aire *******************************************/ void affiche_arbre(NOEUD * p, int prof) -/* prof est utilise pour decaller l'affichage avec des espaces (selon le niveau dans l'arbre) */ +/* prof est utilise pour decaller l'affichage avec des espaces (selon le niveau dans l'arbre) */ { int i; @@ -111,8 +112,19 @@ void affiche_arbre(NOEUD * p, int prof) NOEUD *supprime(NOEUD * p, char *mot, int i) /* i est l'indice de la lettre courante dans le mot */ { - /* TODO */ - return p; + if (p) { + if (p->lettre < mot[i]) { + p->frere = supprime(p->frere, mot, i); + } else if (p->lettre == mot[i]) { + p->fils = supprime(p->fils, mot, i + 1); + if (!p->fils) { + NOEUD *p1 = p; + p = p->frere; + free(p1); + } + return p; + } + } } /* Destruction des arbres de racine p en recuperant la place occupee (free) par chacun des noeuds */ @@ -197,6 +209,8 @@ int main(int argc, char *argv[]) if (recherche(arbre, "salut", 0)) printf("mot \"salut\" present\n"); sauve_dico(arbre, "dictionnaire_debug", nb_mots); + supprime(arbre, "zazou", 0); + affiche_arbre(arbre, 0); detruis_arbre(arbre); if (!arbre) affiche_arbre(arbre, 0);