Systeme de listes et pointeurs [C] - C++ - Programmation
Marsh Posté le 18-04-2002 à 15:02:27
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.
Marsh Posté le 18-04-2002 à 15:23:52
>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;
};
Marsh Posté le 18-04-2002 à 15:34:15
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
Marsh Posté le 18-04-2002 à 16:48:49
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 );
}
Marsh Posté le 18-04-2002 à 14:45:09
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!