[c] bloquée sur cette fonction

Résolu
stroumpf Messages postés 292 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
J'ai une fonction qui prends en entrée une liste chainé(une liste des mots) et elle renvoie des regles sous cette forme " mot->liste des mots"
par exemple on a une liste chainée en entree : une liste des mots "bonjour les amis"
donc comme resultat on doit avoir :
bonjour->les amis
les ->amis
J'ai deja developpé qui affiche une liste chainée.
mais je trouve pas comment integrer l'affiche de la liste, le caractere "->" et l'affichage du mot.
merci.
j'attends vos reponses.
Configuration: Windows Vista
Internet Explorer 7.0

3 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Tu vois que tu n'as plus besoin de nous ^^
    1
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Essaye déjà d'écrire ton algorithme en pseudo code. On verra ensuite comment l'écrire en C.
    Autre question, est ce que tu ne veux pas plutôt afficher "bonjour->les->amis" ce qui paraîtrait plus logique vu ta structure de donnée ?
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      void GenRA(Liste * l)
      {
           Liste *p;
           Liste *q;
           for(p=l;p!=NULL;p=p->suivant)
           {
           printf("%s ->", p->m);
           for (q=p->suivant; q!=NULL; q++)
           {
               printf("%s",q->m);
               }
               }
               
      }   



      EXP:
      liste initiale : bonjour les amis
      bonjour->les amis
      les->amis
      0
      1. mich62120 Messages postés 636 Statut Membre 6 > stroumpf Messages postés 292 Statut Membre
         
        Salut,

        Je n'ai jamais utiliser de Liste chaînée mais est ce que tu es sur du q++? Ce n'est pas q=q->suivant?

        OU avec while
        void GenRA(Liste * l)
        {
             Liste *p;
             Liste *q;
             for(p=l;p!=NULL;p=p->suivant)
             {
             printf("%s ->", p->m);
             
           q=p->suivant;   
        
            while(q !=null){
                 
               printf(" %s",q->m);
               q=q->suivant;}
        }
                 
        } 


        Cela me semblerai plus logique mais comme j'ai dis je n'ai jamais utiliser donc ce n'est qu'une supposition.
        0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Stroumpf voici ton algorithme en pseudo code, c'est par la que tu dois commencer vu que tu débutes en algorithmique :
    Pour chaque maillon i du début à la fin
      Ecrire le maillon i
      Ecrire "->"
      Ecrire le reste de la liste
      Passer à la ligne
    Fin pour
    

    Or Ecrire le reste de la liste s'écrit :
    Pour chaque maillon de j du maillon après i à la fin
      Ecrire le maillon j
      Ecrire " "
    Fin pour

    Ensuite pour écrire le mallon après i il faut s'assurer que celui ci existe (en d'autres terme que i n'est pas le dernier maillon ie qu'il a un successeur). Il suffit donc de rajouter un test au préalable. A la fin on a le pseudo code :
    Pour chaque maillon i du début à la fin
      Ecrire le maillon i
      Ecrire "->"
      Si i-> suivant != NULL
        Pour chaque maillon de j du maillon après i à la fin
          Ecrire le maillon j
          Ecrire " "
        Fin pour
      Fin si
      Passer à la ligne
    Fin pour

    Reste juste à décrire ce que signifie attendre la fin de la liste dans nos deux boucles pour. Ca revient simplement à tester si le pointeur vers le maillon suivant n'est pas NULL.
    typedef struct maillon{
      char *mot;
      struct maillon * suivant;
    } maillon_t;
    
    typedef maillon * liste_t;
    
    void ecrire_maillon(const maillon_t *maillon){
      printf("%s",maillon->mot);
    }
    
    void ecrire_liste(const liste_t *pl){
      const maillon_t *pmailllon_i,pmaillon_j;
      for(pmaillon_i = *pl; pmaillon_i->suivant != NULL ; pmaillon_i = pmaillon_i->suivant){
        ecrire_maillon(pmaillon_i);
        printf("->");
        if(pmaillon_i->suivant != NULL){
          for(pmaillon_j = pmaillon_i->suivant;pmaillon_j->suivant != NULL; pmaillon_j = pmaillon_j->suivant){
            ecrire_maillon(pmaillon_i);
          }
        }
        printf("\n");
      }
    }

    Je n'ai pas vérifié le code mais avec ça tu es proche de ta solution, je te laisse peaufiner la fin.

    Bonne chance
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      merci Mamiemando,
      J'ai deja trouvé une solution qui marche :
      regarde :
      void GenRA(Liste * l)
      {   Liste *q;   
      float support;
      for(q=l;q!=NULL;q=q->suivant)   {   
           
              mots *m;   
               for(m=q->m;m!=NULL && m->suivant!=NULL;m=m->suivant)
          {   
                      mots *s;    
                         printf("%s ->",m->mot);  
                              for(s=m->suivant;s!=NULL;s=s->suivant)   
                                   printf("%s ",s->mot); 
                                   printf ("%s", "support"); 
                                   support=long(q->freq)/float(10);
                                   printf("%f",  support );
                                        printf("\n");   
            } 
            }
            } 
      
      0