Liste doublement chainée en C

Bonjour à tous,
j'ai défini une liste chainée bidirectionnelle avc

typedef struct liste
{
struct liste *suivant;
struct liste *precedent;
int valeur;
}LISTE;

g une fonction insertion() ki insert des valeurs au fur et a mesure ds ma liste chainée, avc une allocation dynamique.

Puis apres je voudrai afficher ma liste ds l'ordre inverse(c'est a dire afficher la derniere valeur entrer jusqu'a la premiere) en me servant de *precedent. mais je n'y arrive pas.

Pouvez-vous m'aider svp à écrire la fonction insertion et d'affichage afin de permettre d'afficher dans l'ordre inverse?

Merci d'avance.
Cordialement.

5 réponses

  1. Contributeur
    Je dirais qu'il faut parcourir 2 fois la liste chainée... ce n'est pas très pratique, mais bon, il n'y a que ça à mon avis!

    void affichageFin (LISTE *fin) 
    { 
        LISTE *p; 
        LISTE * q;
        p=fin; 
    
        while (p != NULL) 
        { 
            q=p;
            p = p->suivant; 
        } 
        while(q!=NULL){
           p=q;
           q=q->precedent;
           printf("%d\n", p->valeur);
       }
    } 


    Maily :-))))
    Boumj'chtattrape
    1. voila le code ki me permet d'inserer des valeur en queue de chaine, et de les afficherdu debut à la fin. Pouvez vous m'aider a les afficher de la fin de la chine jusqu'au debut merci.

      
      #include <stdio.h> 
      #include <stdlib.h> 
      
      typedef struct liste 
      { 
          struct liste *suivant; 
          struct liste *precedent; 
          int valeur; 
      
      }LISTE; 
      
      void affichage (LISTE *fin) 
      { 
          LISTE *p; 
      
          p=fin; 
          while (p != NULL) 
          { 
              printf ("%d\n", p->valeur); 
              p = p->suivant; 
          } 
      } 
      
      LISTE *insertion (int valeur, LISTE *p) 
      { 
          LISTE *nouveau; 
      
          p->precedent = p->suivant; 
          nouveau = malloc(sizeof(LISTE)); 
      
      //    printf("%d,%d",p->precedent,p->suivant); 
          p->suivant = nouveau; 
          nouveau->suivant=NULL; 
          nouveau->valeur = valeur; 
          return nouveau; 
      } 
      
      int main () 
      { 
          int i, n; 
          LISTE *tete, *p; 
      
          printf ("Taille de la liste:"); 
          scanf ("%d", &n); 
      
          p = (LISTE*) &tete; 
          for (i=1; i<=n; i++) 
          { 
              p = insertion (i*i, p); 
          } 
          affichage(tete); 
      }
      
      
      1. #include <stdio.h> #include <stdlib.h> typedef struct liste
        {
        struct liste *suivant;
        struct liste *precedent;
        int valeur;

        }LISTE;

        // tu peux utiliser le paramètre "alafin" dans la procédure
        // car tu ne modifies que la valeur locale (une copie sur la
        // pile du pointeur "p" passé en paramètre)
        void affichageFin (LISTE *alafin)
        {
        while (alafin != NULL)
        {
        printf("%d\n",alafin->valeur);
        alafin=alafin->precedent;
        }
        }
        void affichage (LISTE *fin)
        {
        LISTE *p;

        p=fin;
        while (p != NULL)
        {
        printf ("%d\n", p->valeur);
        p = p->suivant;
        }
        }

        LISTE *insertion (int valeur, LISTE *p)
        {
        LISTE *nouveau;

        p->precedent = p->suivant;
        nouveau = malloc(sizeof(LISTE));
        if (nouveau != NULL)
        {
        // on vérifie tjs un pointeur alloué!!!!
        // printf("%d,%d",p->precedent,p->suivant);
        p->suivant = nouveau;
        nouveau->suivant=NULL;
        nouveau->valeur = valeur;
        }
        return nouveau;
        }

        int main ()
        {
        int i, n;
        LISTE *tete, *p; /* *p est en fait ta fin de liste */

        printf ("Taille de la liste:");
        scanf ("%d", &n);

        p = (LISTE*) &tete; for (i=1; i<=n; i++)
        {
        p = insertion (i*i, p);
        }
        affichage(tete);
        affichagefin(p);
        }
        1. Contributeur
          Bonjour!

          Pourrais tu mettre le code déjà écrit qu'on puisse partir d'une base s'il te plait? Comme ça, on ira plus vite pour t'aider!

          ;-)

          Maily :-))))
          Boumj'chtattrape