Programme de liste chainée

Fermé
mimi1234 Messages postés 7 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 24 mai 2008 - 17 mai 2008 à 18:05
Ipsec Messages postés 11 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 6 juin 2008 - 19 mai 2008 à 17:36
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

3 réponses

daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
17 mai 2008 à 20:22
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 

0
Ipsec Messages postés 11 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 6 juin 2008 1
17 mai 2008 à 21:07
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 ;)
0
mimi1234 Messages postés 7 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 24 mai 2008
18 mai 2008 à 21:04
merci en tout les cas.mais ce que tu m as donnée ce n est pas les morceaux de code.......
0
Ipsec Messages postés 11 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 6 juin 2008 1 > mimi1234 Messages postés 7 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 24 mai 2008
19 mai 2008 à 17:36
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 ;)
0
daronmaster Messages postés 326 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 11 mai 2009 44
17 mai 2008 à 20:27
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
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
17 mai 2008 à 21:13
Salut,

tu peux regarder dans la FAQ

liste simplement chaînée
liste doublement chaînée
0
mimi1234 Messages postés 7 Date d'inscription samedi 17 mai 2008 Statut Membre Dernière intervention 24 mai 2008
18 mai 2008 à 20:59
merci de ton aide
0