A voir également:
- Programme de liste chainée
- Liste déroulante excel - Guide
- Programme demarrage windows - Guide
- Liste code ascii - Guide
- Liste déroulante en cascade - Guide
- Liste de diffusion whatsapp - Guide
3 réponses
est-ce que ce .h te conviendrait ?
j'ai l'âme charitable :
j'ai l'âme charitable :
#ifndef LISTE_H
#define LISTE_H
/*-------------------------------------------------------------*
| |
| Module de creation/gestion d'une liste generique(void *) |
| |
*-------------------------------------------------------------*/
typedef struct TCell{
void *cell;
struct TCell *next;
struct TCell *previous;
}TCell;
typedef struct{
TCell *begin;
TCell *end;
TCell *iterator;
int sizeElt;
int length;
int posIterator;
}TList;
TList * TListCreate(int sizeElt); //creation d'une liste
TList * TListCreateCopy(const TList *l); //creation d'une liste par copie
void TListDelete(TList **l); //destruction d'une liste
void pushBegin(TList *l,const void *elt); //ajout en debut de liste
void pushEnd(TList *l,const void *elt); //ajout en fin de liste
void pushIterator(TList *l,const void *elt); //ajout au niveau de l'iterator
void * topBegin(const TList *l); //renvoie sans suppression l'elt de debut de liste
void * topEnd(const TList *l); //renvoie sans suppression l'elt en fin de liste
void * topIterator(const TList *l); //renvoie sans suppression l'elt au niveau de l'iterator
void * popBegin(TList *l); //suppression en debut de liste
void * popEnd(TList *l); //suppression en fin de liste
void * popIterator(TList *l); //suppression au niveau de l'iterator
void nextIterator(TList *l); //incrementation de l'iterateur
void previousIterator(TList *l); //decrementation de l'iterateur
void iteratorAtBegin(TList *l); //iterateur au debut
int getPositionIterator(const TList *l); //getteur position de l'iterateur
void setPositionIterator(TList *l, int indice); //setteur position de l'iterateur
int getSizeElt(const TList *l); //taille des elements
int getLength(const TList *l); //taille de la liste
int isEmpty(const TList *l); //liste vide ?
int isIteratorBegin(const TList *l); //iterateur au debut ?
int isIteratorEnd(const TList *l); //iterateur a la fin ?
void ** listToArray(const TList *l); //liste vers tableau
void arrayDelete(void **tab); //destruction du tableau
#endif
ceci n'est que le point te permettant d'avoir un aperçu de ce que tu dois faire.
Je pense que c'est à toi de coder le reste, et si tu as besoin d'aide n'hesite pas mais code avant et mets ton code ppur voir ce qui ne va pas.
bon courage
Je pense que c'est à toi de coder le reste, et si tu as besoin d'aide n'hesite pas mais code avant et mets ton code ppur voir ce qui ne va pas.
bon courage
void definir_liberation_liste(TList self, void (*liberer)(void*));
ou a la creation:
TList * TListCreate(int sizeElt, void (*liberer)(void*));
En modifiant bien sur la structure en conséquence.
Peut etre meme faire la meme chose pour une fonction d'affichage et pourquoi pas une fonction de comparaison ;)
typedef struct TCell{ void *cell; struct TCell *next; struct TCell *previous; }*TCell; typedef struct{ TCell *begin; TCell *end; TCell *iterator; //Ces lignes semblent en trop /* int sizeElt; int length; int posIterator;*/ void (*liberer)(void*); void (*afficher)(void*); void (*comparer)(void*,void*); }*TList;Et par exemple la creation pourrai etre:
//la taille(sizeElt) d'une liste simplement chainée ou doublement n'est pas utile si tu n'utilise pas de tableau pour les crées TList * TListCreate(/*int sizeElt, */void (*liberer)(void*),void (*comparer)(void*,void*)){ TList * self = malloc(sizeof(*self)); if(self == NULL){ perror(malloc()); exit(errno); } self->begin = NULL; self->end = NULL; self->iterator = NULL; self->liberer = liberer; self->comparer = comparer; self->afficher = NULL; //Ces lignes me semblent superflus /* self->sizeElt = sizeElt; self->length = 0; self->posIterator = -1;*/ return self; }Et pour l'insertion tu aurai un truc du genre:
//Ici je ne tient pas compte de la comparaison mais on peu la rajouter pour avoir par exemple une liste ordonnée void pushEnd(TList *l,const void *elt){ TCell *tmp = malloc(sizeof(*tmp)); if(tmp == NULL){ perror(malloc()); exit(errno); } tmp->cell = elt; tmp->previous = l->end; tmp->next = NULL; l->end = tmp; }Et par exemple pour l'affichage on aurai:
void afficher_liste(TList * self){ if(self->afficher != NULL){ for(TCell *tmp = self->begin ;tmp!=NULL; tmp = tmp->next) self->afficher(tmp->cell); } }Apres a chacun sa vision des choses.
Voilu ;)