Programme de liste chainée

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

  1. 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
    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
    2. merci en tout les cas.mais ce que tu m as donnée ce n est pas les morceaux de code.......
      0
    3. @mimi1234Tu 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
  2. 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