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 :

Pb avec les liste chainées


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 94
    Par défaut Pb avec les liste chainées
    Salut tout le monde,
    J'ai introduit des fonctions classiques de manipulation des listes chainées dans mon application mais j'ai trouvé des résultats étranges.

    Lorsque j'ai essayé les fonctions des listes chainées dans un petit programme à part j'ai remarqué que la suppression d'élement (qui sont des entiers) consiste à remplacer l'élément supprimé par un autre élément de valeur 0.

    voici le code vous pouvez tester, j'ai utilisé le compilateur gcc sous ubuntu
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    #include <stdio.h>
    #include <math.h>
     
    typedef struct ID_REQUEST {
    int val;
     
    struct ID_REQUEST * suivant;
     
    }ID_REQUEST;
     
    void afficherListe(ID_REQUEST* liste);
    void ajouter(ID_REQUEST*liste, int valeur);
    void supprimerElement(ID_REQUEST* liste, int valeur);
    /********************************** *********************/
    void ajouter(ID_REQUEST*liste, int valeur){
     
          struct ID_REQUEST* new = malloc(sizeof *new);
          if(new != NULL ) {
    	new->val=valeur;
    	new->suivant = NULL;
         }
     
         if (liste == NULL){
    	  liste = new;
     
          }
          else {
    	struct ID_REQUEST* temp=liste;
    	while(temp->suivant != NULL){
    	    temp = temp->suivant;
            }
    	temp->suivant = new;
    	return;
          }
    }
    /********************************** *********************/
    void supprimerElement(ID_REQUEST* liste, int valeur)
    {
        /* Liste vide, il n'y a plus rien à supprimer */
        if(liste == NULL)
            return;
     
    	  /* Si l'élément en cours de traitement doit être supprimé */
    	  if(liste->val == valeur)
    	  {
    	      /* On le supprime en prenant soin de mémoriser 
    	      l'adresse de l'élément suivant */
    	      ID_REQUEST* tmp = liste->suivant;
    	      free(liste);
    	      /* L'élément ayant été supprimé, la liste commencera à l'élément suivant
    	      pointant sur une liste qui ne contient plus aucun élément ayant la valeur recherchée */
    	      supprimerElement(tmp, valeur);
     
    	      return;
    	  }
    	  else
    	  {
    	      /* Si l'élement en cours de traitement ne doit pas être supprimé,
    	      alors la liste finale commencera par cet élément et suivra une liste ne contenant
    	      plus d'élément ayant la valeur recherchée */
    	      supprimerElement(liste->suivant, valeur);
    	      return;
    	  }
     
    }
    /********************************** *********************/
    void afficherListe(ID_REQUEST* liste)
    {
        ID_REQUEST *tmp = liste;
        /* Tant que l'on n'est pas au bout de la liste */
        printf("\n ********************************** \n");
        while(tmp != NULL)
        {
            /* On affiche */
            printf("%d ", tmp->val);
            /* On avance d'une case */
            tmp = tmp->suivant;
        }
    }
    /********************************** *********************/
    int main(){
        struct ID_REQUEST* liste = malloc(sizeof *liste);
        afficherListe(liste);
        ajouter(liste, 1);
        ajouter(liste, 3);
        afficherListe(liste);
        supprimerElement(liste,3);
        afficherListe(liste);
     
    }
    Merci pour votre aide.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Je crois qu'il y a des gros soucis dans ton code, aussi bien dans l'ajout que dans la suppression... Je vais commenter ton code là ou je pense qu'il y a des trucs incorrects...
    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
    void ajouter(ID_REQUEST*liste, int valeur){
     
          struct ID_REQUEST* new = malloc(sizeof *new);
          if(new != NULL ) {
    	new->val=valeur;
    	new->suivant = NULL;
     
         }
         /*Et sinon, si erreur d'allocation, il ne faudrait pas inserer l'element !*/
     
         if (liste == NULL){ /*Si la liste est vide*/
    	  liste = new; 
                  /*tu changes le pointeur, mais a la sortie, il n'a pas change ! Il  s'agit d'un passage par valeur. De plus, vu ton main, tu ne passes jamais par ici.*/
     
          }
          else {/*Ajout en fin de liste apparemment, ok*/
    	struct ID_REQUEST* temp=liste;
    	while(temp->suivant != NULL){
    	    temp = temp->suivant;
            }
    	temp->suivant = new; /*ok*/
    	return;
          }
    Pour gerer l'insertion, tu pourrais faire en sorte que ta fonction retourne un pointeur sur la tete de ta liste. Comme ca tu pourrais gerer l'insertion du premier element sans te casser la tete...

    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
     
    void supprimerElement(ID_REQUEST* liste, int valeur)
    {
        /* Liste vide, il n'y a plus rien à supprimer */
        if(liste == NULL)
            return;
     
    	  /* Si l'élément en cours de traitement doit être supprimé */
    	  if(liste->val == valeur)
    	  {
    	      /* On le supprime en prenant soin de mémoriser 
    	      l'adresse de l'élément suivant */
    	      ID_REQUEST* tmp = liste->suivant;
    	      free(liste); /*Et le raccord ??? L'element precedent pointe sur une zone memoire qui a ete libérée !!*/
    	      /* L'élément ayant été supprimé, la liste commencera à l'élément suivant
    	      pointant sur une liste qui ne contient plus aucun élément ayant la valeur recherchée */
    	      supprimerElement(tmp, valeur);
     
    	      return;
    	  }
    	  else
    	  {
    	      /* Si l'élement en cours de traitement ne doit pas être supprimé,
    	      alors la liste finale commencera par cet élément et suivra une liste ne contenant
    	      plus d'élément ayant la valeur recherchée */
    	      supprimerElement(liste->suivant, valeur);
    	      return;
    	  }
     
    }
    Ta fonction est incorrecte car tu ne raccordes pas les maillons. Il faut que l'élément précédent celui que tu supprimes ait pour nouveau successeur le successeur de l'élément à supprimer (à lire lentement^^).
    Ecrire cette fonction en itératif est surement plus simple qu'en récursif...

Discussions similaires

  1. Problème avec les listes chainées
    Par t-mac06 dans le forum Débuter
    Réponses: 12
    Dernier message: 26/01/2012, 20h57
  2. petit problème avec les listes chainées
    Par djinpark1 dans le forum Débuter
    Réponses: 4
    Dernier message: 30/06/2009, 17h11
  3. programmation avec les listes chainées
    Par rufa11 dans le forum Gnome
    Réponses: 0
    Dernier message: 11/02/2009, 07h08
  4. difficulté avec les listes chainées
    Par sneb5757 dans le forum Débuter
    Réponses: 3
    Dernier message: 30/09/2008, 09h34
  5. Problème avec les listes chainées
    Par reeda dans le forum C++
    Réponses: 10
    Dernier message: 23/04/2008, 16h21

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