Salut,
Il y a une contradiction entre ta phrase " je veux que chaque ligne soit un maillon de ma chaîne " et la structure que tu définis en l’appelant "liste". Ta structure n’est pas la liste, mais simplement un élément (maillon) de la liste (chaine).
C’est ce qui t'as fait te prendre les pieds dans le tapis, car tu n’as pas su où tu devais stocker les mots. Et du coup tu les as stocké nulle part, d’où le pb.
Par suite, il y a une ambigüité dans ta fonction initliste(), et une grave erreur de fuite mémoire dans addendlist().
Les mots que tu lis dans le fichier doivent bien être stockés quelques part. Or toi, tu ne stockes dans ton maillon de chaine qu’un pointeur. Mais il pointe vers quoi ?
Le mieux c’est de les mettre dans les éléments(maillons), d’autant que tu as choisi de faire une allocation mémoire par malloc() pour chaque élément.
Code :
- const int MaxLongMot = 32;
- typedef struct ElemtListe_ {
- char mot[MaxLongMot];
- struct ElemtListe_ *precedant;
- struct ElemtListe_ *suivant;
- }
- SElemtListe;
|
J’ai commencé par créer une constante globale pour la longueur maxi du mot. Ce qui permet d’éviter des erreurs ailleurs dans le prog si l’on change sa valeur. Et "mot" est un tableau de char.
Note que je mets un "S" devant le nom de mes structures pour me rappeler que c’est un type de données et pas une variable.
Ensuite je crée une structure pour la liste elle-même. Elle ne contient que 2 choses pour l’instant, mais peut être (sans doute) au fur et a mesure que le prog grandira elle pourra s’étoffer.
Code :
- typedef struct {
- SElemtListe *Elemt1; // pointeur sur le 1er élément de la liste, Si NULL, la liste est vide
- int nbElemt; // c ton "length" que je mets là
- }
- SListe;
|
Ma fonction InitListe() est différente de la tienne qui n’était qu’un cas particulier de la fonction AddEndListe().
A propos de cet identifiant, je me permets de te dire que mélanger la très belle langue française avec l’horrible dialecte rosbif, n’est pas conseillé par l’Académie des Arts et Belles-Lettres.
Code :
- void InitListe( SListe *liste ) {
- if ( !liste ) return; // remarque ce petit test de sécurité, qui peut etre un jour ne sera pas inutile
- liste->Elemt1 = NULL;
- liste->nbElemt = 0;
- }
|
La fonction main() devient plus claire :
Code :
- int main() {
-
- FILE *lect;
- SListe liste; // une liste est crée dans la pile
- char mot[MaxLongMot];
- /* transformation du dico en liste chainee */
- InitListe(&liste);
- lect = fopen("fichier.txt", "r" );
-
- while ( fgets(mot, MaxLongMot, lect) ) {
-
- AjouteMotFinListe(mot,&liste); // stocke le mot en fin de liste, et fait l'incrémentation du nb d'éléments de la liste
- }
- fclose(lect);
- return 0;
- }
|
Il ne te reste plus qu'a faire une fonction AjouteMotFinListe() qui fonctionne meme pour le premier élément de la liste. Note que cette fonction devra demander par malloc() de la memoire pour l'élément en question. Et donc il te faudra tot ou tard ecrire une fonction SupprimeMotListe() qui appelera free() pour libérer cette mémoire. La règle de programmation étant, qu'à chaque malloc(), il faut son free().
Et bien sûr le plus important : Bonne Année 2008, à tous les pros et apprentis programmeurs C/C++ qui passent par ce forum.
Message édité par cmoila le 02-01-2008 à 12:57:25