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 :

Supprimer un élément d'une liste chainée


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 227
    Points : 39
    Points
    39
    Par défaut Supprimer un élément d'une liste chainée
    Bonjour,

    j'ai un petit soucis dans un programme, j'ai une liste chainée et je dois la parcourir a un moment pour supprimé des maillions.

    voila ma structure et ma liste chainnée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct          s_block
    {
      wchar_t               **line;
      struct s_block        *nxt;
    }                       t_block;
     
    typedef struct          s_data
    {
      char                  *path;
      char                  **flag;
      t_block               *block;
    }                       t_data;


    Voila ma fonction de parcours.

    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
    int     save(t_data *data)
    {
      t_block     *tmp;
      int           flag;
      int           indice = 0;
     
      tmp = data->block;
      while (tmp != NULL)
        {
          if (delete_this(tmp->line) == 1)
            {
              delete_block(data, indice);
            }
          tmp = tmp->nxt;
          indice++;
        }
      return 1;
    }
    voila la fonction qui supprime

    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
    35
    36
     int     delete_block(t_data *data, int indice)
    {
      t_block       *tmp;
      t_block       *tmp_old = NULL;
      int           i = 0;
     
      tmp = data->block;
      while (tmp != NULL)
        {
          if (i == indice)
            {
              if (tmp == data->block)
                {
                  //on free                                         
                  data->block = tmp->nxt;
                }
              else if (tmp->nxt == NULL)
                {
                  //on free                                         
                  tmp_old->nxt = NULL;
                  /* tmp = tmp_old; */
                  /* tmp->nxt = NULL; */
                }
              else
                {
                  tmp_old->nxt = tmp->nxt;
                  //on free                                         
                }
              return 1;
            }
          tmp_old = tmp;
          tmp = tmp->nxt;
          indice++;
        }
      return 1;
    }
    je ne comprend d'ou vien le probleme, pouvez vous m'aider ?

    ma fonction supprime mal.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    C'est à dire, quel est le symptome?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 227
    Points : 39
    Points
    39
    Par défaut
    Certaine fois je passe dans la fonction de suppression et le maillon n'est pas supprimé.

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 580
    Points : 7 712
    Points
    7 712
    Par défaut
    Bonjour,

    tout d'abord, la fonction delete_block() ne détruit rien, elle ne fait que sortir de la liste le i-ème élément.
    il y a du code en trop, mais cette fonction fait bien la sortie de chaîne.

    La fonction save() appelle delete_this() et delete_block(). Il faut espérer que delete_this() tout comme delete_block() ne détruise rien car immédiatement après elle utilise tmp->nxt alors que 'tmp' vient peut-être d'être détruit.

    As-tu le code de delete_this() ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 227
    Points : 39
    Points
    39
    Par défaut
    delete_this = delete_block
    je l'ai juste renomé enfaite

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 580
    Points : 7 712
    Points
    7 712
    Par défaut
    Alors donne le "vrai' code de Save().

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 227
    Points : 39
    Points
    39
    Par défaut
    voila le vrai code

    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
    int     save(t_data *data)
    {
      t_block     *tmp;
      int           flag;
      int           indice = 0;
     
      tmp = data->block;
      while (tmp != NULL)
        {
          if (end(tmp->line) == 1)
            {
              delete_block(data, indice);
            }
          tmp = tmp->nxt;
          indice++;
        }
      return 1;
    }

  8. #8
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 580
    Points : 7 712
    Points
    7 712
    Par défaut
    La fonction delete_block() fin bien l'unlink (et ne détruit rien), si la fonction end() ne détruit rien tout devrait fonctionner.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 227
    Points : 39
    Points
    39
    Par défaut
    C'est résolue , j'avais deux problème majeurs !

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

Discussions similaires

  1. Supprimer le 1er élément d'une liste chainée
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 02/06/2007, 01h05
  2. Réponses: 12
    Dernier message: 04/03/2007, 11h43
  3. Réponses: 3
    Dernier message: 25/10/2006, 19h08
  4. Supprimer des éléments d'une liste
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 15h08
  5. Réponses: 8
    Dernier message: 01/04/2006, 10h10

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