Creation arbre avec liste

Creation arbre avec liste - C - Programmation

Marsh Posté le 27-12-2005 à 16:40:09    

Bonjour
 
Je dois créer un arbre avec une liste contenant un code morse déja rempli.
 
Exemple:
Ma liste contient par exemple
A .-
B -...
C -.-.
etc ....
 
Déclaration de l'arbre
 

Code :
  1. struct noeud
  2. {
  3.    char lettre;
  4.    struct noeud* fdroit;
  5.    struct noeud* fgauche;
  6. }
  7. typedef struct noeud Noeud;
  8. typedef Noeud* arbre;


 
Avec cette déclaration, a chaque fois que je vais par exemple sur le fils gauche je dois l'aasocier à un "-" sous entendu pr pouvoir faire mes recherches sur la liste et récupérer la lettre correspondante.
Pour fils droit je dois "."
 
 
Je ne sait pas comment faire ou par ou commencé car je sui un peu perdu et compren pas comment faire pr sous entendre que droit  c un "." et gauche "-"
 

Reply

Marsh Posté le 27-12-2005 à 16:40:09   

Reply

Marsh Posté le 27-12-2005 à 17:07:22    

en clair, ce que tu veux, c'est un arbre dont les feuilles sont des lettres et dont le chemin d'accès correspond à leur code en morse ?

Reply

Marsh Posté le 27-12-2005 à 17:08:01    

theshockwave a écrit :

en clair, ce que tu veux, c'est un arbre dont les feuilles sont des lettres et dont le chemin d'accès correspond à leur code en morse ?


 
 
Oui  c'est exactement ça

Reply

Marsh Posté le 27-12-2005 à 17:14:40    

Je ne m'y connais pas en morse, mais j'imagine qu'il n'y aura pas une lettre associée à chaque noeud ...
 
normalement, avec un algorithme récursif, tu devrais t'en sortir. Tu prends chacune des lettres et tu appliques ton algo à son chemin. Ton algo devra simplement s'assurer que tout noeud par lequel il passe est créé (et le créer s'il ne l'est pas) et positionner la lettre en question au bout du chemin.
essaye de faire les premiers pas, on t'aidera si tu as du mal :)

Reply

Marsh Posté le 27-12-2005 à 17:17:41    

theshockwave a écrit :

Je ne m'y connais pas en morse, mais j'imagine qu'il n'y aura pas une lettre associée à chaque noeud ...
 
normalement, avec un algorithme récursif, tu devrais t'en sortir. Tu prends chacune des lettres et tu appliques ton algo à son chemin. Ton algo devra simplement s'assurer que tout noeud par lequel il passe est créé (et le créer s'il ne l'est pas) et positionner la lettre en question au bout du chemin.
essaye de faire les premiers pas, on t'aidera si tu as du mal :)


 
jvé essayé merci

Reply

Marsh Posté le 27-12-2005 à 17:40:01    

theshockwave a écrit :

Je ne m'y connais pas en morse, mais j'imagine qu'il n'y aura pas une lettre associée à chaque noeud ...
 
normalement, avec un algorithme récursif, tu devrais t'en sortir. Tu prends chacune des lettres et tu appliques ton algo à son chemin. Ton algo devra simplement s'assurer que tout noeud par lequel il passe est créé (et le créer s'il ne l'est pas) et positionner la lettre en question au bout du chemin.
essaye de faire les premiers pas, on t'aidera si tu as du mal :)


 
 
J'ai un soucis j'arrive pas à continuer à partir d'ici en je ne sais pas comment faire pr extraire un caractere d'une chaine
 
 voila ce que j'ai :

Code :
  1. boolean estVide(Arbre a)
  2. {
  3. if (a==NULL) return vrai;
  4. else return faux;
  5. }
  6. Arbre* Creer(Arbre* a, Liste l)
  7. {
  8.   Arbre acre=NULL;
  9.   int i;
  10.  
  11.  
  12.    if estVide(*a)
  13.    {
  14.         acre = (Arbre) malloc(sizeof(Noeud)); // racine de l'arbre
  15.         acre->lettre =' '; // caractere à la racine espace
  16.         acre->fdroit=NULL; 
  17.         acre->fgauche=NULL;
  18.         *a = acre;
  19.    }   
  20.    else
  21.    {
  22.        while (l!=NULL)
  23.        {
  24.              i=0;
  25.              while ((l->morse+i)!='\0') // j'ai un soucis ici pr extraire
  26.              {
  27.                  
  28.              }
  29.        }
  30.    }
  31. }

Reply

Marsh Posté le 27-12-2005 à 17:45:49    

attention : NULL est une valeur particulière désignant une adresse invalide pour un pointeur. Dans ta fonction estVide, tu la compares à ta structure de noeud et ca n'a pas de sens.
 
là, tu pars sur une base itérative, je ne dis pas que c'est impossible à faire, mais ce sera probablement moins naturel que de l'écrire en récursif. quel est le type de l ? Liste n'est pas un type standard
 
(pour ton problème d'extraction, il s'agit simplement de parcourir la chaine, normalement : tu prends un pointeur sur le premier élément puis tu le fais avancer jusqu'à rencontrer le 0 terminal)

Reply

Marsh Posté le 27-12-2005 à 17:53:35    

theshockwave a écrit :

attention : NULL est une valeur particulière désignant une adresse invalide pour un pointeur. Dans ta fonction estVide, tu la compares à ta structure de noeud et ca n'a pas de sens.
 
là, tu pars sur une base itérative, je ne dis pas que c'est impossible à faire, mais ce sera probablement moins naturel que de l'écrire en récursif. quel est le type de l ? Liste n'est pas un type standard
 
(pour ton problème d'extraction, il s'agit simplement de parcourir la chaine, normalement : tu prends un pointeur sur le premier élément puis tu le fais avancer jusqu'à rencontrer le 0 terminal)


 
 

Code :
  1. Arbre* Creer(Arbre* a, Liste l)
  2. {
  3.   Arbre acre=NULL;
  4.   Arbre g =NULL;
  5.   Arbre d = NULL;
  6.   char* p;
  7.   int i;
  8.  
  9.  
  10.    if estVide(*a)
  11.    {
  12.         acre = (Arbre) malloc(sizeof(Noeud)); // racine de l'arbre
  13.         acre->lettre =' '; // caractere à la racine espace
  14.         acre->fdroit=NULL; 
  15.         acre->fgauche=NULL;
  16.         *a = acre;
  17.    }   
  18.    else
  19.    {
  20.        while (l!=NULL)
  21.        {
  22.              i=0;// pr parcourir la chaine morse enfin je croi
  23.              p = l->morse;
  24.              while (*p != '\0')
  25.              {
  26.                    if (*p=='-')
  27.                    {
  28.                       if (acre->fgauche==NULL)
  29.                       {
  30.                          g  = (Arbre) malloc(sizeof(Noeud)); //créer à gauche
  31.                          g->lettre =' ';
  32.                          g->fgauche = NULL;
  33.                          g->fdroit = NULL;
  34.                       } 
  35.                       acre->fgauche = g;
  36.                    }
  37.                    else // c'est un .
  38.                    {
  39.                       if (acre->fdroit==NULL)
  40.                       {
  41.                          d  = (Arbre) malloc(sizeof(Noeud)); //créer à droite
  42.                          d->lettre =' ';
  43.                          d->fgauche = NULL;
  44.                          d->fdroit = NULL;
  45.                       } 
  46.                       acre->fdroit = d;
  47.                    }
  48.              }
  49.              acre->lettre = l->c; // on le copie à l'adrrese de fin
  50.              p++;
  51.        }
  52.    }
  53. }


 
Le problème du estVide je ne voit pas comment faire pr le résoudre sinon pr le traitement récursif  c'est un peu hard pr mon niveau.Dans ce cas, faudra que je modifie les valeurs en param. Je ne sais pas.
 
Pourrait tu me donnez un coup de main avec ce que je vbien de de présenter

Reply

Marsh Posté le 27-12-2005 à 18:03:21    

le estVide comme tu le vois aurait plutôt cette forme là :
 

Code :
  1. int estVide(Arbre *noeud)
  2. {
  3.   return noeud == NULL;
  4. }


le récursif a un nom qui peut faire peur quand on n'en a pas fait, mais tu verras, ce n'est pas si compliqué que ca :)
 
sinon, diverses remarques :
* p n'est pas incrémenté dans el bon bloc => boucle infinie.
* ta liste de chaines de caractères n'est pas parcourue (pas d'incrémentation du pointeur sur le premier élément)
* il manque le return pour ton arbre
* acre vaut NULL quand tu t'embarques dans ta création d'arbre.
* Comment vas-tu remonter à la racine de l'arbre après avoir fait ton parcours pour la première lettre ?

Reply

Marsh Posté le 27-12-2005 à 18:05:30    

Avec les modifs
 

Code :
  1. #include "arbre.h"
  2. boolean estVideA(Arbre* a)
  3. {
  4. return a==NULL;
  5. }
  6. Arbre* Creer(Arbre* a, Liste l)
  7. {
  8.   Arbre acre=NULL;
  9.   Arbre g =NULL;
  10.   Arbre d = NULL;
  11.   char* p;
  12.   int i;
  13.  
  14.    if (estVideA(*a))
  15.    {
  16.         acre = (Arbre) malloc(sizeof(Noeud)); // racine de l'arbre
  17.         acre->lettre =' '; // caractere à la racine espace
  18.         acre->fdroit=NULL; 
  19.         acre->fgauche=NULL;
  20.    }   
  21.    else
  22.    {
  23.        acre=*a;
  24.        while (l!=NULL)
  25.        {
  26.              i=0;// pr parcourir la chaine morse enfin je croi
  27.              p = l->morse;
  28.              while (*p != '\0')
  29.              {
  30.                    if (*p=='-')
  31.                    {
  32.                       if (acre->fgauche==NULL)
  33.                       {
  34.                          g  = (Arbre) malloc(sizeof(Noeud)); //créer à gauche
  35.                          g->lettre =' ';
  36.                          g->fgauche = NULL;
  37.                          g->fdroit = NULL;
  38.                       } 
  39.                       acre->fgauche = g;
  40.                    }
  41.                    else // c'est un .
  42.                    {
  43.                       if (acre->fdroit==NULL)
  44.                       {
  45.                          d  = (Arbre) malloc(sizeof(Noeud)); //créer à droite
  46.                          d->lettre =' ';
  47.                          d->fgauche = NULL;
  48.                          d->fdroit = NULL;
  49.                       } 
  50.                       acre->fdroit = d;
  51.                    }
  52.                    p++;
  53.              }
  54.              acre->lettre = l->c; // on le copie à l'adrrese de fin
  55.            
  56.        }
  57.    }
  58.    return acre;
  59. }


Message édité par rabzouze le 27-12-2005 à 18:09:24
Reply

Marsh Posté le 27-12-2005 à 18:05:30   

Reply

Marsh Posté le 27-12-2005 à 18:10:04    

pr remonter à la racine je ne compren pas le concept je sais pas comment faire.
Peut tu m'expliquer

Reply

Marsh Posté le 27-12-2005 à 18:14:14    

ilf aut simplement que tu prévoies de garder un pointeur sur la racine de côté (ce que tu vas retourner) qui soit une variable différente de celle qui te sert à parcourir ton arbre ...
 
(note que ton appel à estVideA est invalide puisque l'argument que tu lui donnes est du type "Arbre" alors qu'il attent un "Arbre *" ... inutile de déréférencer ta variable a pour cet appel, donc)
 
essaye de découper un peu plus le procédé. Ca rendra ton code plus lisible. Avoir ta fonction de création qui itère sur les éléments de la liste et fait ensuite appel à une autre fonction pour l'insertion d'un élément de la liste dans l'arbre serait probablement une bonne chose, non ?

Reply

Marsh Posté le 27-12-2005 à 18:17:00    

tu as raison

Reply

Marsh Posté le 27-12-2005 à 18:22:49    

coup de pouce :  
 

Arbre Creer(Arbre a, liste l) :
  si a est vide :
    creerArbre(a)
  pour chaque lettre de la liste :
    insereMorse(a, lettre.morse, lettre.caractere)
  retourne a
 
insereMorse(Arbre a, chaine morse, char caractere) :
  si morse est vide :
    a.lettre = caractere
  sinon
    si le premier caractère de morse est '.' :
      si a.droit est vide :
        creerArbre(a.droit)
      insereMorse(a.droit, morse sans le premier caractère, caractere)
    sinon
      si a.gauche est vide :
        creerArbre(a.gauche)
      insereMorse(a.gauche, morse sans le premier caractère, caractere)


voilà en gros le procédé que tu devrais avoir pour du récursif
 
Edit : je te l'accorde, ce n'est pas très formel ... mais c'est juste pour présenter brièvement l'idée. A toi d'écrire ca en C ... Attention aux types (je me suis permis quelques écarts de ce point de vue là)

Message cité 1 fois
Message édité par theshockwave le 27-12-2005 à 18:24:47
Reply

Marsh Posté le 27-12-2005 à 18:33:36    

theshockwave a écrit :

coup de pouce :  
 

Arbre Creer(Arbre a, liste l) :
  si a est vide :
    creerArbre(a)
  pour chaque lettre de la liste :
    insereMorse(a, lettre.morse, lettre.caractere)
  retourne a
 
insereMorse(Arbre a, chaine morse, char caractere) :
  si morse est vide :
    a.lettre = caractere
  sinon
    si le premier caractère de morse est '.' :
      si a.droit est vide :
        creerArbre(a.droit)
      insereMorse(a.droit, morse sans le premier caractère, caractere)
    sinon
      si a.gauche est vide :
        creerArbre(a.gauche)
      insereMorse(a.gauche, morse sans le premier caractère, caractere)


voilà en gros le procédé que tu devrais avoir pour du récursif
 
Edit : je te l'accorde, ce n'est pas très formel ... mais c'est juste pour présenter brièvement l'idée. A toi d'écrire ca en C ... Attention aux types (je me suis permis quelques écarts de ce point de vue là)


 
Pourrais tu me dire à que représente creerArbre. A moins que ce soit la meme que creer
Merci pr le code

Reply

Marsh Posté le 27-12-2005 à 18:34:43    

C'est bon j'ai compris

Reply

Marsh Posté le 27-12-2005 à 18:35:06    

creerArbre serait en fait une méthode d'allocation et d'initialisation d'un arbre (mettre les fils à NULL est une étape à ne pas oublier ;) )

Reply

Marsh Posté le 27-12-2005 à 18:36:27    

Mici

Reply

Marsh Posté le 27-12-2005 à 18:36:38    

je v faire la traduction et te montrer

Reply

Marsh Posté le 27-12-2005 à 18:53:37    

theshockwave a écrit :

creerArbre serait en fait une méthode d'allocation et d'initialisation d'un arbre (mettre les fils à NULL est une étape à ne pas oublier ;) )


 
Voila j'ai fini peut tu y jeter un coup d'oeil STP
 

Code :
  1. #include "arbre.h"
  2. boolean estVideA(Arbre* a)
  3. {
  4. return a==NULL;
  5. }
  6. void creerArbre(Arbre* a)
  7. {
  8.       Arbre p=NULL;
  9.       p = (Arbre) malloc(sizeof(Noeud)); // racine de l'arbre
  10.       p->lettre =' '; // ????? C'est bon si je met un espace pr initialiser
  11.       p->fdroit=NULL; 
  12.       p->fgauche=NULL;
  13.       *a=p;
  14. }
  15. void insereMorse(Arbre* a,char* morse,char car)
  16. {
  17.    char* p = morse;
  18.  
  19.    if (strcmp(morse,"" )==0) // pr dire que c'est egale
  20.       a->lettre=car;
  21.    else
  22.    {
  23.        if (*p=='.')
  24.        {
  25.           if (estVideA(a->fdroit))
  26.              creerArbre(a->fdroit);
  27.            
  28.           insereMorse(a->fdroit,*(p++),car); 
  29.        }
  30.        else
  31.        {
  32.            if (estVideA(a->fgauche))
  33.              creerArbre(a->fgauche);
  34.            
  35.           insereMorse(a->fgauche,*(p++),car);
  36.        }
  37.    }
  38. }
  39. Arbre* creer(Arbre* a,Liste l)
  40. {
  41.    if (estVideA(a))
  42.    {
  43.       creerArbre(a);
  44.    }
  45.    else
  46.    {
  47.        while (l!=NULL)
  48.        {
  49.             insereMorse(a,l->morse,l->c);
  50.        }
  51.    }
  52.    return a;
  53. }


 
Merci

Reply

Marsh Posté le 27-12-2005 à 20:59:08    

awww ... je me suis fourvoyé en relisant ton code ... Je me suis fait avoir par le typedef ... désolé
 
Erm, pour éviter les ennuis, soit tu remplaces Arbre par Noeud dans ce fichier, soit tu ajoutes en début de fichier (ou dans arbre.h) :

Code :
  1. typedef Noeud Arbre;


(auquel cas tu devras garder en tête la différence qu'il y a à mettre une majuscule à Arbre ou non, ce qui n'est pas terrible pour la lisibilité)
 
pour créerArbre, il faut que cette fonction puisse modifier l'argument qu'on lui passe dans le contexte de la fonction appelante. Il faut donc passer un pointeur sur le pointeur d'arbre que tu désires modifier :

Code :
  1. void creerArbre(Noeud **a)
  2. {
  3.   Arbre p=NULL;
  4.   p = malloc(sizeof(Noeud)); // pas de cast sur un malloc
  5.   p->lettre =' '; // a toi de voir en fonction de l'énoncé
  6.   p->fdroit=NULL;
  7.   p->fgauche=NULL;
  8.   *a=p;
  9. }


 
j'en profite pour te refaire ta fonction estVide() :

Code :
  1. int estVide(Noeud *a)
  2. {
  3.   return a == NULL;
  4. }


 
Pour la fonction d'insertion, j'espère que tu as saisi le principe en l'écrivant ... En tout cas, on ne fait pas un strcmp pour voir si on a atteint la fin, mais on regarde simplement si la valeur pointée est nulle. Attention aux déréférencements, par contre : tu changes le type. Tu dois bien voir que p est du même type que morse, donc si tu déréférence p au moment où tu le passes en paramètre à ta fonction, alors tu n'as pas le type attendu :/
Ensuite, modifier morse directement ne modifiera pas les données du contexte appelant, donc créer une variable p ne sert pas vraiment :/

Code :
  1. void insereMorse(Noeud* a, char* morse, char car)
  2. {
  3.   if(*morse==0) // si morse pointe sur le caractère de fin de chaine
  4.     a->lettre=car;
  5.   else
  6.   {
  7.     if (*morse=='.')
  8.     {
  9.       if (estVideA(a->fdroit))
  10.         creerArbre(a->fdroit);
  11.       insereMorse(a->fdroit, p+1, car);
  12.     }
  13.     else
  14.     {
  15.       if (estVideA(a->fgauche))
  16.         creerArbre(a->fgauche);
  17.       insereMorse(a->fgauche, p+1, car);
  18.     }
  19.   }
  20. }


 
et maintenant, pour la fonction elle-même, j'ai de gros doute sur la manière dont tu parcours ta liste (et d'ailleurs, tu n'as toujours pas répondu à ma question à ce sujet : où est la définition de Liste ?)

Reply

Marsh Posté le 29-12-2005 à 17:24:48    

theshockwave a écrit :

awww ... je me suis fourvoyé en relisant ton code ... Je me suis fait avoir par le typedef ... désolé
 
Erm, pour éviter les ennuis, soit tu remplaces Arbre par Noeud dans ce fichier, soit tu ajoutes en début de fichier (ou dans arbre.h) :

Code :
  1. typedef Noeud Arbre;


(auquel cas tu devras garder en tête la différence qu'il y a à mettre une majuscule à Arbre ou non, ce qui n'est pas terrible pour la lisibilité)
 
pour créerArbre, il faut que cette fonction puisse modifier l'argument qu'on lui passe dans le contexte de la fonction appelante. Il faut donc passer un pointeur sur le pointeur d'arbre que tu désires modifier :

Code :
  1. void creerArbre(Noeud **a)
  2. {
  3.   Arbre p=NULL;
  4.   p = malloc(sizeof(Noeud)); // pas de cast sur un malloc
  5.   p->lettre =' '; // a toi de voir en fonction de l'énoncé
  6.   p->fdroit=NULL;
  7.   p->fgauche=NULL;
  8.   *a=p;
  9. }


 
j'en profite pour te refaire ta fonction estVide() :

Code :
  1. int estVide(Noeud *a)
  2. {
  3.   return a == NULL;
  4. }


 
Pour la fonction d'insertion, j'espère que tu as saisi le principe en l'écrivant ... En tout cas, on ne fait pas un strcmp pour voir si on a atteint la fin, mais on regarde simplement si la valeur pointée est nulle. Attention aux déréférencements, par contre : tu changes le type. Tu dois bien voir que p est du même type que morse, donc si tu déréférence p au moment où tu le passes en paramètre à ta fonction, alors tu n'as pas le type attendu :/
Ensuite, modifier morse directement ne modifiera pas les données du contexte appelant, donc créer une variable p ne sert pas vraiment :/

Code :
  1. void insereMorse(Noeud* a, char* morse, char car)
  2. {
  3.   if(*morse==0) // si morse pointe sur le caractère de fin de chaine
  4.     a->lettre=car;
  5.   else
  6.   {
  7.     if (*morse=='.')
  8.     {
  9.       if (estVideA(a->fdroit))
  10.         creerArbre(a->fdroit);
  11.       insereMorse(a->fdroit, p+1, car);
  12.     }
  13.     else
  14.     {
  15.       if (estVideA(a->fgauche))
  16.         creerArbre(a->fgauche);
  17.       insereMorse(a->fgauche, p+1, car);
  18.     }
  19.   }
  20. }


 
et maintenant, pour la fonction elle-même, j'ai de gros doute sur la manière dont tu parcours ta liste (et d'ailleurs, tu n'as toujours pas répondu à ma question à ce sujet : où est la définition de Liste ?)


 
 
 
Excuse je rempli ma liste a partir d'un fichier je v tenvoyé le code que j'ai reussi a faire pour la liste juste un soucis avec le ajout kant je le fait a part tu verra c un pe brouillon mais ca fontionne
 
 
fichier typeliste.h

Code :
  1. #ifndef TYPELISTE_H
  2. #define TYPELISTE_H
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. struct element
  6. {
  7.     char c;
  8.     char *morse;
  9.     struct element* suiv;
  10. };
  11. typedef struct element Element;
  12. typedef Element* Liste;
  13. #endif


 
 
fichier liste.c

Code :
  1. #include "liste.h"
  2. boolean estVide(Liste l)
  3. {
  4. if (l==NULL) return vrai;
  5. else return faux;
  6. }
  7. void Ajouter(char c,char *m,Liste *l)
  8. {
  9. Liste p=NULL;
  10. Liste q=NULL;
  11. if (estVide(*l)==vrai)
  12. {
  13.  p= (Liste) malloc(sizeof(Element));
  14.  p->c=c;
  15.  p->morse=(char *)malloc((strlen(m)+1)*sizeof(char));
  16.  strcpy(p->morse,m);
  17.  p->suiv=NULL;
  18.  *l=p;
  19. }
  20. else
  21. {
  22.  p=Precedent(c,*l);
  23.  q= (Liste) malloc(sizeof(Element));
  24.  q->c=c;
  25.  q->morse=(char *)malloc((strlen(m)+1)*sizeof(char));
  26.  strcpy(q->morse,m);
  27.  q->suiv=p->suiv;
  28.  p->suiv=q;
  29. }
  30. }
  31. Liste InitListe(char *Fcode)
  32. {
  33. FILE *fp;
  34. char c;
  35. char ligne[100];
  36. char car;
  37. int j;
  38. char *code;
  39.  
  40. Liste l = NULL;
  41.       fp=fopen(Fcode,"r" );
  42.       if(fp==NULL) printf("Fichier existe pas\n" );
  43.       else
  44.       {
  45.     printf("Initliste" );
  46.           c=fscanf(fp,"%c %s\n",&car,ligne);
  47.           while(c!=EOF)
  48.           {
  49.               j=strlen(ligne)+1;
  50.               code=(char*) malloc(sizeof(char)*j);
  51.               strcpy(code, ligne);
  52.  
  53.               /***Ajoute sur liste ****/
  54.               Ajouter(car,code,&l);
  55.               /***************************/
  56.   printf("Initliste Ajouter" );
  57.            c=fscanf(fp,"%c %s\n",&car,ligne);
  58.           }
  59.        fclose(fp);
  60.        }
  61.        Afficher_liste(l);
  62.        return l;
  63. }
  64. Liste Precedent(char c,Liste l) // renvoi l'element precedent c
  65. {
  66. Liste q,prec;
  67. prec=l;
  68. q=l->suiv;
  69. while(q!=NULL && ((char)q->c) < ((char)c))
  70. {
  71.  prec=q;
  72.  q=q->suiv;
  73. }
  74. return prec;
  75. }
  76. int position(char c,char* m,Liste l)
  77. {
  78. int i=0;
  79. while (l!=NULL)
  80. {
  81.  if (c==l->c && strcmp(l->morse,m)==0) return i;
  82.  i++;
  83.  l=l->suiv;
  84. }
  85. return -1;
  86. }
  87. void Afficher_liste(Liste l)
  88. {
  89. int k;
  90. Liste p = l;
  91. while(l)
  92. {
  93.  printf("Element : %c  %s ",l->c,l->morse);
  94.  k = position(l->c,l->morse,p);
  95.  if (k==-1) printf("Element n'existe pas" );
  96.  printf(" (%d)\n",k);
  97.  l=l->suiv;
  98. }
  99. }
  100. char RechercheLettreListe(char *m,Liste l)
  101. {
  102. Liste p = l;
  103. while(p)
  104. {
  105.  if (strcmp(p->morse,m)==0) return p->c;
  106.  p=p->suiv;
  107. }
  108. return '0';
  109. }
  110. char* RechercheMorseListe(char c,Liste l)
  111. {
  112. Liste p = l;
  113. while(p)
  114. {
  115.  if (p->c==c) return p->morse;
  116.  p=p->suiv;
  117. }
  118. return NULL;
  119. }
  120. void suprAvecLettre(char c,Liste *l)
  121. {
  122. Liste p,prec;
  123. if (estVide(*l)==faux)
  124. {
  125.  p=*l;
  126.  if (p->c==c)
  127.  {
  128.   p=*l;
  129.   *l=p->suiv;
  130.   free(p);
  131.  }
  132.  else
  133.  {
  134.   prec=Precedent(c,*l);
  135.   if (((prec->suiv==NULL)) || (prec->suiv->c)!=c )
  136.   {
  137.    printf("La lettre tapé n'est pas dans la liste" );
  138.   }
  139.   else
  140.   {
  141.    p=prec->suiv;
  142.    prec->suiv=p->suiv;
  143.    free(p);
  144.   }
  145.  }
  146. }
  147. else
  148. {
  149.  printf("La Liste est vide" );
  150. }
  151. }
  152. void TraduireEnMorse(Liste l,char *Fsource,char *Fdest)
  153. {
  154. /*****Travaile sur fichier code*///
  155. FILE *Fcode;
  156. char *c;
  157. char ligne[100];
  158. int i;
  159. char *recupMorse;
  160. /**********************************/
  161.  
  162.  
  163. /******Fichier convert****************/
  164. FILE *FenMorse;
  165. /******************************/
  166.  
  167. Fcode=fopen(Fsource,"r" );
  168. FenMorse=fopen(Fdest,"w" );
  169. if(Fcode==NULL) printf("Fichier existe pas\n" );
  170.         else
  171.         {
  172.   while((c=fgets(ligne,100,Fcode))!=NULL)
  173.   {
  174.    i=0;
  175.   // while((ligne[i]!='\0') && (i<strlen(ligne)))
  176.    while(ligne[i]!='\0')
  177.   {
  178.    if(ligne[i]==' ')
  179.    {
  180.     fprintf(FenMorse," * " );
  181.      
  182.    }
  183.    else if (ligne[i]=='\n')
  184.    {
  185.     fprintf(FenMorse,"\n" );
  186.    }
  187.    else
  188.    {
  189.     recupMorse = RechercheMorseListe(ligne[i],l);
  190.     fprintf(FenMorse,"%s$",recupMorse);
  191.      
  192.    }
  193.    i++;
  194.   }
  195.    
  196.   }
  197.   }
  198.   fclose(Fcode);
  199.   fclose(FenMorse);
  200.    
  201. }


 
fichier qui teste  princliste.c

Code :
  1. #include "liste.h"
  2. #define FICHIER "code.txt"
  3. #define FICHIER2 "Traduit.txt"
  4. #define FICHIER3 "ConvertMorse.txt"
  5. main()
  6. {
  7. Liste l = InitListe(FICHIER);
  8. Afficher_liste(l);
  9. TraduireEnMorse(l,FICHIER2,FICHIER3);
  10. }


 
 
Il ya aussi le fichier liste.h mais bon tu sait que j'y ai mit seulement les entetes de fonctions voila mnt tu as tout ce que j'ai si tu ne compren pas di le moi pr la liste pr l'arbre par contre jai un blocage mais je verrai  
Tiens moi o courant si ca ne tiens pas la route

Reply

Marsh Posté le 29-12-2005 à 17:29:39    

Excuse moi en parlant de lhistoire du typedef j'ai ceci
 
fichier typearbre.h
 
#ifndef TYPEARBRE_H
#define TYPEARBRE_H
 
#include <stdio.h>
#include <stdlib.h>
 
struct noeud
{
 char lettre;
 struct noeud* fdroit;
 struct noeud* fgauche;
};
 
typedef struct noeud Noeud;
typedef Noeud* Arbre;  
 
#endif
 
 
tOn code ne fonctionnera pas il y aura des soucisde poiinteurs  Type différents avec mon typedef
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed