[Resolu] Transformation d'un fichier en liste doublement chainée

Transformation d'un fichier en liste doublement chainée [Resolu] - C - Programmation

Marsh Posté le 30-12-2007 à 17:57:24    

Bonjour,
 
Je cherche à transformer un fichier en liste doublement chainée.
Mon fichier contient un mot de moins de 32 caractères par ligne. Et je veux que chaque ligne soit un maillon de ma chaîne.
 

Code :
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<math.h>
  5. typedef struct liste_ {
  6.      char *mot;
  7.      struct liste_ *precedant;
  8.      struct liste_ *suivant;
  9. }
  10. liste;
  11. liste *initliste (char *mot) {
  12.     liste *L;
  13.     L = (liste*)malloc(sizeof(liste));
  14.     L->mot = mot;
  15.     L->precedant = NULL;
  16.     L->suivant = NULL;
  17.     return L;
  18. }
  19. void addendliste(char *mot, liste *L) {
  20.     liste *T, *tmp;
  21.     T = (liste*)malloc(sizeof(liste));
  22.     tmp = (liste*)malloc(sizeof(liste));
  23.     tmp = L;
  24.     while (tmp->suivant != NULL)
  25.         tmp = tmp->suivant;
  26.     T->mot = mot;
  27.     T->precedant = tmp;
  28.     T->suivant = NULL;
  29.     tmp->suivant = T;
  30. }
  31. int main() {
  32.     liste *L;
  33.     int length = 1;
  34.     char mot[32];
  35.     char tmp[32];
  36.     FILE *lect;
  37. /* transformation du dico en liste chainee */
  38.     lect = fopen ("fichier.txt", "r" );
  39.     fgets(mot, 32, lect);
  40.     strcpy (tmp, mot);
  41.     L = initliste(tmp);
  42.     while (fgets(mot, 32, lect)!= NULL) {
  43.         /*strcpy (tmp2, mot);*/
  44.         addendliste(mot, L);
  45.         length++;
  46.     }
  47.     fclose (lect);
  48.     printf("L: %sL->suivant: %s", L->mot, L->suivant->mot);
  49.     return 0;
  50. }


 
Mon gros soucis est que à chaque fois que je fais un fgets il écrase un des maillons (car cela pointe vers la même adresse...). J'ai essayé d'utiliser un char xxx[32] en tant que buffeur mais cela ne m'a pas aidé...
 
Des idées ? :)
 
Merci,
Beamo

Message cité 1 fois
Message édité par Beamo le 07-01-2008 à 11:10:33
Reply

Marsh Posté le 30-12-2007 à 17:57:24   

Reply

Marsh Posté le 30-12-2007 à 18:18:56    

Beamo a écrit :

Mon gros soucis est que à chaque fois que je fais un fgets il écrase un des maillons (car cela pointe vers la même adresse...). J'ai essayé d'utiliser un char xxx[32] en tant que buffeur mais cela ne m'a pas aidé...
 
Des idées ? :)


Il faut évidemment que chaque chaine lue ait son propre espace mémoire... strdup() (POSIX.1, donc très portable) est bien pratique pour ça.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-12-2007 à 23:05:45    

Je n'arrive pas à utiliser le strdup, cela me dit que la fonction n'est pas déclarée.
Il faut que mon code soit compilable sur un Linux.
 
Mais un strcpy devrait a peu près jouer le même rôle non ?
 
Comment se fait-il que ma variable se fait écraser même quand je fais un strcpy (tmp2, mot) et que je lance la fonction avec tmp2.
Lors du fgets (mot) suivant, cela change aussi mon maillon.
Le strcpy ne permet pas de faire l'allocation mémoire automatiquement ?
 
Beamo

Message cité 1 fois
Message édité par Beamo le 30-12-2007 à 23:06:53
Reply

Marsh Posté le 30-12-2007 à 23:19:00    

Beamo a écrit :

Je n'arrive pas à utiliser le strdup, cela me dit que la fonction n'est pas déclarée.
Il faut que mon code soit compilable sur un Linux.


Tu as inclus <string.h> ?
Tu n'es pas en mode -ansi -pedantic ?
 
Cette fonction est facilement reproductible avec
strlen() pour la mesure
malloc() pour l'allocation
strcpy() pour la copie.
 
Nota : strcpy() ne fait justement pas ce que fait strdup(). Pourquoi ne pas lire la doc des fonctions en cas de doute ?
 
man strcpy()
man strdup()


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 31-12-2007 à 00:30:15    

Oki merci !
 
J'ai vu un ancien post ou tu proposais la même chose et qq1 a montré comment l'utiliser avec malloc et strcpy.
 
J'ai testé cela fonctionne ! :)
 
Merci
Beamo

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed