[c] bloquée sur cette fonction

Résolu
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. Modérateur
    Tu vois que tu n'as plus besoin de nous ^^
    1
    1. Modérateur
      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. 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
      2. @stroumpfSalut,

        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
    2. Modérateur
      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. 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