[resolu] recherche et insertion structure liste chaine: la V2

recherche et insertion structure liste chaine: la V2 [resolu] - C - Programmation

Marsh Posté le 09-02-2010 à 23:06:51    

Salut vloila, ça marche
 
merci pour les conseils et à bientot
 
(et oui je reviendrais avec encore plus d'erreurs  :sol: )
 
fichier texte

Code :
  1. 19800105 19852512 ry  fuiui
  2. 20000000 21110100 iu uio io
  3. 19821454 20545644 oh
  4. 19999999 20151522 kkkj jkj
  5. 21000541 56405440 ouhuh  i i
  6. 19855213 45812344 uig uy  gi
  7. 12014550 45686401 i gt tf yi
  8. 18562080 45605640 ui g
  9. 17545645 54406000 iufuf


 
code

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. typedef struct news
  6. {
  7.     int  date_dbt;
  8.     int  date_fin;
  9.     char texte[100];
  10.     struct news * suiv;
  11. } news_t;
  12. int lecture_fic(char nomfichier[], news_t ** tete);
  13. void sauvegarde_fichier(news_t * tete);
  14. news_t * creer_cellule(int date_dbt, int date_fin, char * textu);
  15. news_t ** recherche_prec(int date_dbt, news_t ** tete);
  16. void insertion(news_t ** prec, news_t * temp);
  17. void affichage(news_t * tete);
  18. /* ******************************************************** */
  19. /*               lecture fichier                            */
  20. /*                                                          */
  21. /*     enregistre les donnees du fichier dans une SDD       */
  22. /*                                                          */
  23. /*    retourne 1 si reussite, 0 sinon                       */
  24. /* ******************************************************** */
  25. int lecture_fic(char nomfichier[], news_t ** tete)
  26. {
  27.     int code_erreur = 0;
  28.     char * retour_chariot;
  29.     FILE * fic;
  30.     fic = fopen( nomfichier, "r" );
  31.     if (fic)
  32.     {
  33.         int  date_dbt;
  34.         int  date_fin;
  35.         char texte[100];
  36.         while( !feof(fic))
  37.         {
  38.             fscanf(fic,"%d %d", &date_dbt, &date_fin);
  39.             fgets(texte, 100*sizeof(char),fic);
  40.             retour_chariot = strchr(texte, '\n');
  41.         if ( retour_chariot) *retour_chariot = 0;
  42.         insertion(recherche_prec(date_dbt, tete), creer_cellule(date_dbt, date_fin, texte));
  43.         }
  44.     }
  45.     else
  46.     {
  47.         code_erreur = 1;
  48.     }
  49.     fclose(fic);
  50.     return code_erreur;
  51. }
  52. void sauvegarde_fichier(news_t * tete)
  53. {
  54.     char nom_fic[25];
  55.     FILE * fic;
  56.     printf("Entrer le nom du fichier\n" );
  57.     fscanf(stdin, "%s", nom_fic);
  58.     if (fic = fopen(nom_fic,"w+" ))
  59.     {
  60.         while ( tete != NULL)
  61.         {
  62.             fprintf(fic, "%d %d %s\n", tete->date_dbt, tete->date_fin, tete->texte);
  63.             tete = tete->suiv;
  64.         }
  65.     }
  66.     fclose(fic);
  67. }
  68. int date_jour()
  69. {
  70.     time_t timestamp = time(NULL);
  71.     int date_du_jour;
  72.     strftime(date_du_jour, sizeof(date_du_jour), "%Y%m%d", localtime(&timestamp));
  73.     printf("%d\n", date_du_jour);
  74. }
  75. news_t ** recherche_prec(int date_dbt, news_t ** tete)
  76. {
  77.     news_t ** prec, * cour;
  78.     prec = tete;
  79.     cour = * tete;
  80.     while ( (cour != NULL) && (cour->date_dbt < date_dbt) )
  81.     {
  82.         prec = &((*prec)->suiv);
  83.         cour = cour->suiv;
  84.     }
  85.     return prec;
  86. }
  87. news_t * creer_cellule(int date_dbt, int date_fin, char textu[])
  88. {
  89.     news_t * temp;
  90.     temp = malloc(sizeof(news_t));
  91.     if ( temp == NULL)
  92.     {
  93.         printf("\nerreur allocation 2\n" );
  94.     }
  95.     else
  96.     {
  97.         temp->date_dbt = date_dbt;
  98.         temp->date_fin = date_fin;
  99.         strcpy( temp->texte, textu);
  100.         temp->suiv = NULL;
  101.     }
  102.     return temp;
  103. }
  104. void insertion(news_t ** prec, news_t * temp)
  105. {
  106.     temp->suiv = (*prec);
  107.     (*prec) = temp;
  108. }
  109. void affichage(news_t * tete)
  110. {
  111.     printf("********* HERE WE GO! *********\n" );
  112.     while ( tete != NULL)
  113.     {
  114.         printf("%d => %d : %s\n", tete->date_dbt,tete->date_fin,tete->texte);
  115.         tete= tete->suiv;
  116.     }
  117.     printf("*******************************\n\n" );
  118. }
  119. int main(int argc, char * argv[])
  120. {
  121.     news_t * tete = NULL;
  122.     lecture_fic(argv[1], &tete);
  123.     affichage(tete);
  124.     sauvegarde_fichier(tete);
  125.     date_jour();
  126.     return 1;
  127. }


Message édité par karlakir le 11-02-2010 à 21:33:38

---------------
Si vous avez rien à faire, cliquez ici:
Reply

Marsh Posté le 09-02-2010 à 23:06:51   

Reply

Marsh Posté le 09-02-2010 à 23:34:04    

Ta fonction insertion fait n'importe quoi. D'après le prototype ça doit insérer "temp" après "prec", or avec cette instruction tu fais l'inverse :

Code :
  1. temp->suiv = *prec;


 
Et ta fonction recherche_prec() est bancale aussi, tu commences toujours ta boucle au second élément de la liste (s'il y en a plus d'un). Sinon tu renvoies la tête ou NULL. Bah, pas bon.

Reply

Marsh Posté le 09-02-2010 à 23:49:10    

plop


Message édité par karlakir le 11-02-2010 à 21:31:48

---------------
Si vous avez rien à faire, cliquez ici:
Reply

Marsh Posté le 10-02-2010 à 15:29:57    

Ta fonction recherche_prec c'est encore n'importe quoi. Notamment cette instruction :

Code :
  1. prec = &cour;


 
C'est une variable locale que tu utilises comme valeur de retour. Je te rappelle que toutes les variables locales d'une fonction en C doivent être considérées comme indéfinies une fois sortie de la fonction.
 
Sinon, pourquoi tu te fais chier avec des pointeurs de pointeurs ? Le seul cas où c'est nécessaire, c'est pour le paramète "tete" de la fonction insertion(). Qui plus le test sur la date dans insertion n'a rien à faire là.

Reply

Sujets relatifs:

Leave a Replay

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