[c] bloquée sur cette fonction

Résolu/Fermé
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 24 juil. 2008 à 19:59
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 26 juil. 2008 à 01:13
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.
A voir également:

3 réponses

mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 811
26 juil. 2008 à 01:13
Tu vois que tu n'as plus besoin de nous ^^
1
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 811
25 juil. 2008 à 09:49
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
25 juil. 2008 à 12:52
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
mich62120 Messages postés 631 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 janvier 2010 6 > stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009
25 juil. 2008 à 13:17
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
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 811
25 juil. 2008 à 21:41
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
25 juil. 2008 à 22:06
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