Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1601 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1664121
Beamo
Posté le 30-12-2007 à 17:57:24  profilanswer
 

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
mood
Publicité
Posté le 30-12-2007 à 17:57:24  profilanswer
 

n°1664129
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-12-2007 à 18:18:56  profilanswer
 

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/
n°1664179
Beamo
Posté le 30-12-2007 à 23:05:45  profilanswer
 

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
n°1664182
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-12-2007 à 23:19:00  profilanswer
 

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/
n°1664189
Beamo
Posté le 31-12-2007 à 00:30:15  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Imprimer in fichier sous Windowsenvoyer des données dans une base mysql (resolu)
[c#] Liste des connexions réseauproblèmes lecture d'un fichier texte
session_start() (résolu)Liste déroulante
[RESOLU] syntaxe php[resolu][PHP/JS] Afficher div via selection dans une liste/radio
[SQL Pervasive\VB .NET][RESOLU] Passerelle EBP 
Plus de sujets relatifs à : [Resolu] Transformation d'un fichier en liste doublement chainée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR