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 :

Liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    Lycéen
    Inscrit en
    Novembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 26
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2018
    Messages : 9
    Par défaut Liste chainée
    Alors bonsoir, je pose mon probleme qui porte sur les liste chainer. La fonction consiste a enlever un élément de la liste chainée et libérer la mémoire associée.
    La liste est passé en adresse. Voici le code avec la structure associé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct _animal{
      int x;
      int y;
      int dir[2]; // direction courante sous la forme (dx, dy)
      float energie;
      struct _animal *precedent;
      struct _animal *suivant;
    } Animal;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void enlever_animal(Animal **liste, Animal *animal) {
     
    	if(animal->suivant != NULL)
    		animal->suivant->precedent = animal->precedent;
    	if(animal->precedent != NULL)
    		animal->precedent->suivant = animal->suivant;
    	if(*liste==animal)
    		*liste= animal->suivant;
    	free(animal);
    }
    Je comprend pas a quoi servent les if et egalement leur contenu (par exemple animal->suivant->precedent = animal->precedent c'est assez flou pour moi.
    Merci d'avance au temps que vous passez pour moi

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    D'où vient ce code s'il n'est pas de toi ? Comprends-tu déjà de quelle manière est organisée la liste ?

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par melissa17 Voir le message
    Je comprend pas a quoi servent les if et egalement leur contenu (par exemple animal->suivant->precedent = animal->precedent c'est assez flou pour moi.
    Il s'agit d'une liste doublement chainée avant/arrière. Chaque maillon possède donc l'adresse du suivant et aussi du précédent. Si par exemple j'ai 3 maillons 1, 2 et 3, alors 1 connait 2 (le suivant) ; 2 connait 1 (le précédent) et 3 (le suivant) ; et 3 connait 2 (le précédent).

    Si maintenant j'enlève le maillon 2, alors la liste devient "1, 3" et le précédent du 3 doit passer à 1. Donc (idée) l'instruction pourrait être 3->precedent=1.
    Mais 3 c'est quoi ? C'est le suivant du 2 (on est en train de l'enlever mais il n'a pas encore été enlevé donc il existe toujours et on a encore accès à ses valeurs). Donc l'instruction peut être remplacée par 2->suivant->precedent=1.
    Et 1 c'est quoi ? C'est le précédent de 2. Donc l'instruction change encore pour devenir 2->suivant->precedent=2->precedent.
    Ne reste plus qu'à appliquer à l'animal en cours de suppression et l'instruction devient au final animal->suivant->precedent=animal->precedent.

    Pareil dans l'autre sens (faire passer le suivant du 1 à 3). Et les tests servent à gérer quand le maillon à enlever se trouve en début (dans ce cas il n'a pas de précédent) ou en fin (dans ce cas il n'a pas de suivant) de liste.

    Tu devrais quand-même lire un tutoriel sur le principe des listes chainées. Ca t'aiderait à avoir l'image en tête quand tu lis ce genre de code...
    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]

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  2. Bibliothèque de listes chainées
    Par gege2061 dans le forum C
    Réponses: 29
    Dernier message: 17/12/2004, 20h15
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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