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 -
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. 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
    1. Ipsec Messages postés 11 Date d'inscription   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
    2. mimi1234 Messages postés 7 Date d'inscription   Statut Membre
       
      merci en tout les cas.mais ce que tu m as donnée ce n est pas les morceaux de code.......
      0
      1. Ipsec Messages postés 11 Date d'inscription   Statut Membre 1 > mimi1234 Messages postés 7 Date d'inscription   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
  2. 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
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    tu peux regarder dans la FAQ

    liste simplement chaînée
    liste doublement chaînée
    0
    1. mimi1234 Messages postés 7 Date d'inscription   Statut Membre
       
      merci de ton aide
      0