[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.
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
-
Tu vois que tu n'as plus besoin de nous ^^
-
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 ?-
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- 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 whilevoid 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.
-
-
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-
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"); } } }
-