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 :

Algorithme récursif qui supprime tous les éléments d'une liste


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 22
    Points : 0
    Points
    0
    Par défaut Algorithme récursif qui supprime tous les éléments d'une liste
    Bonjour, j'ai un exercice que je n'ai pas parfaitement saisi.
    Je comprends pas la dernière ligne l<-vide, pourquoi rendre l vide à la fin? est-ce nécéssaire? peut-on le supprimer?
    Voici l'énoncé et le corrigé:

    Enoncé:
    Concevoir un algorithme récursif qui supprime tous les éléments d'une liste simplement chainée et le transforme donc en arbre vide.


    Corrigé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Suppr(l:liste)
    donnée référence: l, la liste à supprimer
    debut
         si l différent vide alors
              Suppr(l->succ)
              libérer l
              l<-vide
         fin
    fin

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ta question n'a pas de rapport avec le langage C.

    Pourrais-tu d'ailleurs préciser cette question ? Le rôle de cette procédure semble être de vider une liste chaînée, c'est ce qu'elle réalise en partant de la fin de la liste passée en paramètre.

  3. #3
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Bonjour.

    Si je traduis la correction de ton exercice en langage C, ça donne quelque chose dans ce genre là :
    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
    struct Cellule
    {
        int             m_element; // par exemple
        struct Cellule* m_suivante;
    };
     
    typedef struct Cellule Cellule;
     
    typedef Cellule* Liste; // une liste vide est un pointeur nul
                            // une liste non vide est un pointeur vers la 1re cellule
     
    void Liste_Suppr(Liste* liste)
    {
        assert(liste != NULL); // petite sécurité
     
        if(*liste != NULL) {                      // si la liste est non vide
            Liste_Suppr(&((**liste).m_suivante)); // supprimer les éventuelles cellules à partir de la 2e
            free(*liste);                         // libérer la mémoire de la 1re cellule
            *liste = NULL;                        // ne plus pointer sur l'espace qu'occupait la 1re cellule
        }
    }
    Dans le code, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            *liste = NULL;                        // ne plus pointer sur l'espace qu'occupait la 1re cellule
    n'est utile que pour la première cellule, donc pour la première itération de l'algo.
    Sans cette ligne, à la fin, au lieu que (*liste) soit un pointeur nul, ce serait un pointeur invalide, plus précisément un pointeur vers l'espace mémoire qu'occupait la première cellule avant que celui-ci ne soit libéré.

    Je ne connais pas tes prérequis en C, donc je ne sais pas si j'ai été clair.

Discussions similaires

  1. Steam : un bug qui supprime tous les fichiers de l'utilisateur
    Par Amine Horseman dans le forum Développement 2D, 3D et Jeux
    Réponses: 19
    Dernier message: 24/01/2015, 13h52
  2. Réponses: 9
    Dernier message: 28/12/2014, 13h48
  3. JList Supprimer Tous les éléments
    Par Ho(c)ine. dans le forum Composants
    Réponses: 3
    Dernier message: 05/02/2011, 07h29
  4. Réponses: 15
    Dernier message: 02/02/2011, 09h56
  5. Supprimer TOUS les espaces d'une chaine
    Par tavekapaclike1er dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/12/2005, 15h19

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