Posez votre question Signaler

Liste doublement chainée en C

Jarod - Dernière réponse le 15 déc. 2007 à 17:26
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.
Lire la suite 

Liste doublement chainée en C »

6 réponses
Réponse
+3
moins plus
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
Ajouter un commentaire
Réponse
+1
moins plus
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); 
}

Ajouter un commentaire
Réponse
+1
moins plus
#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);
}
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
bnjr j' besion de documentaton sur les listes en algorithmique soit cerculaire et bidirectionnelle et chainnée es ce que vous pouvez m'aidée.
lami20j- 15 déc. 2007 à 17:26
Salut,

regarde ici cours file, piles, listes
Ajouter un commentaire
Ce document intitulé « Liste doublement chainée en C » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?