X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=TP5%2Fexo6%2Ffile_chaine_correction.c;fp=TP5%2Fexo6%2Ffile_chaine_correction.c;h=f3c336957b54526951c9f0019a210b0c5026ba40;hb=f5904379c91a724dcc5818fcb80e7b111dc6cf0d;hp=0000000000000000000000000000000000000000;hpb=0146cff3db3fd5c445da626bf0786e2c74a4ecaa;p=Algorithmic_C.git diff --git a/TP5/exo6/file_chaine_correction.c b/TP5/exo6/file_chaine_correction.c new file mode 100644 index 0000000..f3c3369 --- /dev/null +++ b/TP5/exo6/file_chaine_correction.c @@ -0,0 +1,97 @@ +/************************************************************************** + Implantation d'un type File d'entiers sous forme chaînée + + La file est représentée par un doublet tête-queue de pointeurs + vers une cellule. + Le pointeur "tête" contient l'adresse de la tête de la file. + Le pointeur "queue" contient l'adresse de la queue de la file. + + La file vide est représentée par le doublet NULL-NULL + + Chaque cellule pointe vers la cellule suivante de la file +ou vers NULL si on est en queue de file. + +**************************************************************************/ +#include +#include + +typedef int element; +typedef struct cellule {element valeur; + struct cellule *suivant; } Cellule; + +typedef struct file { Cellule *t, *q; } File; /* tête queue */ + +File file_vide(void) +{ + File f={NULL,NULL}; + return f; +} + +int est_vide(File f) +{ + return !f.t; +} + +element tete(File f) +/* ATTENTION: consulter la tête d'une File vide n'a pas de sens */ +{ + if (est_vide(f)) {printf("Erreur - file vide\n"); exit(-1); } + return f.t->valeur; /* la File n'est pas modifiée */ +} + +File enfiler(element e,File f) +{ + Cellule *pc=(Cellule *)malloc(sizeof(Cellule)); + pc->valeur=e;pc->suivant=NULL; + + if (est_vide(f)) + f.t=f.q=pc; /* la cellule créée est à la fois tête et queue */ + else + f.q=f.q->suivant=pc; /* la cellule créée est la nouvelle queue */ + return f; +} + +File defiler(File f) +/* ATTENTION: supprimer la tête d'une File vide n'a pas de sens */ +{ + Cellule *pc=f.t; + if (est_vide(f)) + { + printf("Erreur - file vide\n"); + exit(-1); + } + if (f.t==f.q) f=file_vide(); /* la File n'avait plus qu'une seule cellule */ + else f.t=f.t->suivant; /* la queue ne change pas */ + free(pc); + return f; +} + +element defiler2(File *f) /* ATTENTION: la File est modifiée */ +/* ATTENTION: supprimer la tête d'une File vide n'a pas de sens */ +{ + Cellule *pc=f->t; + element e; + if (est_vide(*f)) + { + printf("Erreur - file vide\n"); + exit(-1); + } + e=f->t->valeur; + if (f->t==f->q) *f=file_vide(); /* la File n'avait plus qu'une seule cellule */ + else f->t=f->t->suivant; /* la queue ne change pas */ + free(pc); + return e; +} + + +/********************************************************************/ +int main() +{ + File p; + int i; + p=file_vide(); + for (i=0; i<20; i++) p=enfiler(i,p); + for (i=0; i<25; i++) printf("%d\n",defiler2(&p)); +} +/********************************************************************/ +