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

  FORUM HardWare.fr
  Programmation
  C

  Creation arbre avec liste

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Creation arbre avec liste

n°1273774
rabzouze
Posté le 27-12-2005 à 16:40:09  profilanswer
 

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 "-"
 

mood
Publicité
Posté le 27-12-2005 à 16:40:09  profilanswer
 

n°1273791
theshockwa​ve
I work at a firm named Koslow
Posté le 27-12-2005 à 17:07:22  profilanswer
 

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 ?

n°1273792
rabzouze
Posté le 27-12-2005 à 17:08:01  profilanswer
 

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

n°1273795
theshockwa​ve
I work at a firm named Koslow
Posté le 27-12-2005 à 17:14:40  profilanswer
 

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 :)

n°1273798
rabzouze
Posté le 27-12-2005 à 17:17:41  profilanswer
 

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

n°1273810
rabzouze
Posté le 27-12-2005 à 17:40:01  profilanswer
 

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. }

n°1273812
theshockwa​ve
I work at a firm named Koslow
Posté le 27-12-2005 à 17:45:49  profilanswer
 

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)

n°1273816
rabzouze
Posté le 27-12-2005 à 17:53:35  profilanswer
 

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

n°1273819
theshockwa​ve
I work at a firm named Koslow
Posté le 27-12-2005 à 18:03:21  profilanswer
 

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 ?

n°1273820
rabzouze
Posté le 27-12-2005 à 18:05:30  profilanswer
 

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
mood
Publicité
Posté le 27-12-2005 à 18:05:30  profilanswer
 

n°1273827
rabzouze
Posté le 27-12-2005 à 18:10:04  profilanswer
 

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

n°1273830
theshockwa​ve
I work at a firm named Koslow
Posté le 27-12-2005 à 18:14:14  profilanswer
 

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 ?

n°1273832
rabzouze
Posté le 27-12-2005 à 18:17:00  profilanswer
 

tu as raison

n°1273834
theshockwa​ve
I work at a firm named Koslow
Posté le 27-12-2005 à 18:22:49  profilanswer
 

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
n°1273847
rabzouze
Posté le 27-12-2005 à 18:33:36  profilanswer
 

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

n°1273848
rabzouze
Posté le 27-12-2005 à 18:34:43  profilanswer
 

C'est bon j'ai compris

n°1273849
theshockwa​ve
I work at a firm named Koslow
Posté le 27-12-2005 à 18:35:06  profilanswer
 

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 ;) )

n°1273851
rabzouze
Posté le 27-12-2005 à 18:36:27  profilanswer
 

Mici

n°1273852
rabzouze
Posté le 27-12-2005 à 18:36:38  profilanswer
 

je v faire la traduction et te montrer

n°1273865
rabzouze
Posté le 27-12-2005 à 18:53:37  profilanswer
 

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

n°1273897
theshockwa​ve
I work at a firm named Koslow
Posté le 27-12-2005 à 20:59:08  profilanswer
 

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 ?)

n°1274548
rabzouze
Posté le 29-12-2005 à 17:24:48  profilanswer
 

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

n°1274551
rabzouze
Posté le 29-12-2005 à 17:29:39  profilanswer
 

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
 

mood
Publicité
Posté le   profilanswer
 


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

  Creation arbre avec liste

 

Sujets relatifs
Peut on faire on faire afficher des couleurs ds liste deroulanteListe chainée
Création CD romArbre binaire
[SQLite] Création d'une table circulaireAjouter un noeud a un arbre en flash
[ASP] [ACTVE DIRECTORY] Liste des groupes d'un utilisateurListe déroulante
Remplir 3 champs texte avec une liste déroulanteTransfert champ texte vers liste multiple
Plus de sujets relatifs à : Creation arbre avec liste


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