Programme de liste chainée

mimi1234 Messages postés 7 Statut Membre -  
Ipsec Messages postés 11 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
A voir également:

3 réponses

daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
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 Statut Membre 1
 
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 Statut Membre
 
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 Statut Membre 1 > mimi1234 Messages postés 7 Statut Membre
 
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   Statut Membre Dernière intervention   44
 
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 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Salut,

tu peux regarder dans la FAQ

liste simplement chaînée
liste doublement chaînée
0
mimi1234 Messages postés 7 Statut Membre
 
merci de ton aide
0