Programme de liste chainée
mimi1234
Messages postés
7
Date d'inscription
Statut
Membre
-
Ipsec Messages postés 11 Date d'inscription Statut Membre -
Ipsec Messages postés 11 Date d'inscription Statut Membre -
Bonjour tout le monde.est ce que vous pouvez m aider pour faire un programme des listes chainées........ajouter dans une liste au debut,a la fin,au milieu et supprimer....merci
Configuration: Windows XP Internet Explorer 6.0
3 réponses
-
est-ce que ce .h te conviendrait ?
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-
J'aurai bien rajouté a cette interface une fonction definissant la façon de liberer la liste:
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 ;) -
- Tu peut modifier ta structure comme sa:
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 ;)
-
-
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 -