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

  FORUM HardWare.fr
  Programmation
  C++

  [C] Systeme de listes et pointeurs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Systeme de listes et pointeurs

n°127888
Franois Ba​yrou
Vive le colza
Posté le 18-04-2002 à 14:45:09  profilanswer
 

voilà pour travail pour l'ecole je dois faire un pti systeme de listes et pointeurs donc dans un premier temps je pensais le faire comme ceci
 
struct bibli
{
int numero;
int volume;
char titre[20];
char auteur[20];
char edition[10];
char date[7];
FILE *psuiv;
int suppr;
};
 
 
avec donc pour chaque fiche le lien vers le suivant etc, avec son adresse disque.
 
Mais je me demandais si je n'allais pas finalement declarer le psuiv en entiers, et retenir sa place dans le fichier, et le retrouver grace a un fseek... vous en pensez quoi?
 
merci beaucoup


---------------
Mais heu!
mood
Publicité
Posté le 18-04-2002 à 14:45:09  profilanswer
 

n°127916
ZeT
Ze Eternal Thrasher! 1st class
Posté le 18-04-2002 à 15:02:27  profilanswer
 

Non tu te casses trop la tête là.
Fait le avec les pointeurs, teste, fait marcher, aprés tu t'amusera à faire une solution tordue.

n°127940
__pascal
Posté le 18-04-2002 à 15:23:52  profilanswer
 

>avec donc pour chaque fiche le lien vers le suivant etc, avec >son adresse disque.  
FILE* n'est pas l'addresse disque du fichier. C'est un pointeur
sur une structure que normalement tu ne dois pas directement modifié.
 
Voici une liste chainée :
 
struct bibli  
{  
  int numero;  
  int volume;  
  char titre[20];  
  char auteur[20];  
  char edition[10];  
  char date[7];  
  struct bibli *psuiv; /* <= pointe sur la liste suivante
                        *  == NULL si fin de liste */
  int suppr;  
};

n°127954
Franois Ba​yrou
Vive le colza
Posté le 18-04-2002 à 15:34:15  profilanswer
 

merci zet
 
 
pascal, en fait je compte enregistrer mon fichier avec toutes ses fiches, donc en l'ouvrant, avec un pointeur dynamique il ne retrouvera jamais la fiche suivante je pense  :??:


---------------
Mais heu!
n°127994
bistou
Vieux .... très très vieux!
Posté le 18-04-2002 à 16:24:55  profilanswer
 

[:screamfr]


---------------
:sol:
n°128021
__pascal
Posté le 18-04-2002 à 16:48:49  profilanswer
 

Pour enregistrer une liste chainée dans un fichier, tu dois parcourir la liste j'usqu'au dernier élément en enregistrant l'élément sur lequel tu te déplace dans le fichier. Et en effet, le pointeur n'a pas lieu d'etre sauvegardé car il n'a plus aucun sens quand on recharge les données. On peut donc écrire
 
 
#include <stdio.h>
#include <stdlib.h>
 
struct bibli  
{  
 int numero;  
 int volume;  
 char titre[20];  
 char auteur[20];  
 char edition[10];  
 char date[7];  
 int suppr;  
};  
 
struct elementBibli{
 struct bibli data;
 struct elementBibli *pSuiv; /* <= pointe sur l'element
                             * de la liste suivante
                             *  == NULL si fin de liste */
};
 
void enregistre( struct elementBibli* e, FILE* fic ){  
  while( e != NULL ){
    fwrite( &(e->data), sizeof(e->data),1, fic );
    e = e->pSuiv;
  }
}
 
/*
Pour recharger, il faut reconstruire la liste chainée  
*/
struct elementBibli* recharge(  FILE* fic ){
   struct elementBibli *courant = (struct elementBibli *)malloc( sizeof(elementBibli) );  
   struct elementBibli *suivant, *tete;
   int lu;
 
   /* Lecture du premier element */
   if( fread( &(courant->data), sizeof(courant->data), 1, fic ) != 1 ){
     /* Echec */
     free( courant );
     return NULL;
 }
 
 courant->pSuiv = NULL;
 tete = courant;  
 
 
 do{
  suivant = (struct elementBibli *)malloc( sizeof(elementBibli) );  
  lu=fread( &(suivant->data), sizeof(suivant->data), 1, fic );
  if( lu == 1 ){
   /* Lecture bien passée */
   courant->pSuiv = suivant;
   suivant->pSuiv = NULL;
   courant = suivant;
  }
 }while( lu == 1 );
 
 free( suivant );
 return tete;
}
       
 
 
 
struct elementBibli* createList(){
 int i;
 struct elementBibli* tete;
 struct elementBibli* courant = (struct elementBibli*) malloc(sizeof(struct elementBibli));
 struct elementBibli* suivant;
 
 tete = courant;
 courant->data.numero = 0;
 
 for( i=1; i<10; i++){
  suivant = (struct elementBibli*) malloc(sizeof(struct elementBibli));
  suivant->data.numero = i;
  courant->pSuiv = suivant;
  courant = suivant;
 }
 
 suivant->pSuiv = NULL;
 return tete;
 
}
 
void affList(struct elementBibli* e){
  if( !e ){ printf( "List vide !!\n" ) ;return; }
  printf( "Numero - " );
  while( e != NULL ){
    printf( "%d - ", e->data.numero);
    e = e->pSuiv;
  }
  printf( "fin list\n" );
}
 
void destruitList(struct elementBibli* e){
 struct elementBibli *courant, *temp;
 
 courant = e;
 
 while( courant != NULL ){
  temp = courant->pSuiv;
  free( courant );
  courant = temp;
 }
}
 
void main(){
 FILE* fic;
 struct elementBibli *list1, *list2;
 
 list1 = createList();
 printf(" Enregistrement dans fichier de la liste 1 : \n" ) ;
 affList( list1 );
 
 fic = fopen( "toto.dat", "w" );
 enregistre( list1, fic );
 fclose( fic );
 
 printf("\n\n Recharche du fichier dans la liste 2 : \n" ) ;
 fic = fopen( "toto.dat", "r" );
 list2 = recharge( fic );
 affList( list2 );
 
 /* Ferme le fichier, libere la mémoire */
 fclose( fic );
 destruitList( list1 );
 destruitList( list2 );
}

n°128041
ZeT
Ze Eternal Thrasher! 1st class
Posté le 18-04-2002 à 17:12:51  profilanswer
 

Oua  :eek2: ça c'est de la réponse !


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

  [C] Systeme de listes et pointeurs

 

Sujets relatifs
[Pascal] nombre limite de valeurs en pointeurs[C++] Utiliser une police externe non système
[PHP] Système de vote... quel est le meilleur moyen de faire ca ?[PHP] système de whois
Probleme de pointeurs en C?Ces p....... de listes
comment forcer les listes deroulantes a resté sous un calque[php/apache]lancer une commande système???
programmation systèmereglage date heure systeme en c++ sous dos
Plus de sujets relatifs à : [C] Systeme de listes et pointeurs


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