IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème avec une file doublement chainée


Sujet :

C

  1. #1
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut Problème avec une file doublement chainée
    Bonsoir tous ,
    voici la file :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    struct  noeud
    {
        int cle;
        struct  noeud   *suivant;
        struct  noeud   *precedant;
    } *debut,*z;
    void    initListe()
    {
        z = malloc(sizeof(struct noeud));
        debut = malloc(sizeof(struct noeud));
        z->suivant = z;
        z->precedant = debut;
        debut->suivant = z;
        debut->precedant = debut;
    }
    int   supprimerAvantZ()
    {
        int cle = z->precedant->cle;
        z->precedant = z->precedant->precedant;
        z->precedant->suivant = z;
     
        return cle;
    }
    struct noeud*    insererApres(int element,struct noeud *t)
    {
        struct noeud *x = malloc(sizeof(struct noeud));
        x->cle = element;
        x->precedant = t;
        x->suivant = t->suivant;
        t->suivant = x;
        x->suivant->precedant = x;
        return x;
    }
    ps: je n'ai pas mis les procédures que je n'utilise pas pour le môment
    Et voici main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    int main()
    {
        struct noeud *un,*deux,*trois,*quatre;
     
        initListe();
     
        un = insererApres(1,debut);
        deux = insererApres(2,debut);
        trois = insererApres(3,debut);
        quatre = insererApres(4,debut);
        printListe();
        insererApres(supprimerAvantZ(),debut);
        printListe();
     
        return 0;
    }
    Voici maintenant ce que je veux :

    4 3 2 1
    1 4 3 2

    Enfin voila ce que je recois :

    4 3 2 1
    1

    Je ne vois pas où est le problème ??

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    à quoi ressemble ta fonction printListe ?
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Désolé ....
    la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void    printListe()
    {
        struct noeud *p = debut;
        while(p->suivant != p->suivant->suivant)
        {
            printf("%d ",p->suivant->cle);
            p->suivant = p->suivant->suivant;
        }
        printf("\n");
    }

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Essaie avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void    printListe() {
        struct noeud *p = debut->suivant;
        while(p != z) {
            printf("%d ",p->cle);
            p = p->suivant;
        }
        printf("\n");
    }
    Petite question : d'où tires-tu cette implémentation des listes doublement chaînées ?
    Perso j'aurais pas codé ça avec des stub à chaque bout (à la rigueur un pointeur en sus sur le dernier élément).
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Mais ça marche
    Je ne vois pas la différence !?

    J'ai implémenté la liste à ma sauce parce qu'il est necessaire que je fasse passer
    le dernier élément en premier !
    Je suis sur un code qui doit afficher toutes les permutations d'une liste d'entier .....

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Le souci vient avant tout de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p->suivant = p->suivant->suivant;
    Là tu ne déplaces pas juste un pointeur d'élément à élément, tu déplaces le pointeur "suivant" de "debut".
    Du coup après un affichage via ta fonction printListe ton arbre est cassé (au moins au niveau de sa tête).

    PS : tu travailles avec quel EDI ? Un bon pas-à-pas+spy t'aurai mis la puce à l'oreille
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Merci pour la précision.
    J'utilise Code::Blocks ; pas très puissant mais léger et gratuit.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par exe2bin Voir le message
    Je suis sur un code qui doit afficher toutes les permutations d'une liste d'entier .....
    Bonjour

    Pourquoi utiliser une liste chainée pour ça ???
    Une liste chainée est un outil qui ne possède qu'un seul avantage: pouvoir facilement insérer et supprimer des éléments n'importe où (sans devoir tout décaler). Mais elle possède en retour de multiples inconvénients dont
    • l'impossibilité de s'adresser directement à l'élément [x]
    • toute modiif implique la mise à jour des éléments liés à l'élément modifié


    Or permuter les éléments d'un tableau peut très bien se faire de façon directe (l'élément [x] va dans tmp, l'élément [y] va dans l'élément [x] puis tmp va dans l'élément [y]). Partant de là, une liste chainée devient inutile (son seul avantage n'est pas exploité et on conserve ses inconvénients)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 06/05/2007, 21h47
  2. Réponses: 2
    Dernier message: 24/03/2007, 12h48
  3. Réponses: 5
    Dernier message: 26/07/2006, 11h13
  4. [Dev-C++]Problème avec une file ...
    Par jobherzt dans le forum Dev-C++
    Réponses: 12
    Dernier message: 15/10/2005, 17h31
  5. problèmes avec "include file" pour une page asp
    Par chipsense dans le forum ASP
    Réponses: 1
    Dernier message: 02/09/2005, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo