Partage
  • Partager sur Facebook
  • Partager sur Twitter

Liste chainées problème lors de la suppression

Sujet résolu
    13 juillet 2018 à 12:22:30

    Bonjour,

    Je sais qu'il y a eu beaucoup de forums à ce sujet mais aucun ( du moins ce que j'ai regardé ) n'a résolu mon problème !

    Ma fonction destroy :

    void destroy(Liste *liste){
        Element *elem = liste->premier;
        while(elem != NULL) {
            Element *aSupprimer = elem;
            elem = elem->suivant;
            free(aSupprimer);
    		aSupprimer = NULL;
        }
    }

    Il semblerait bien que tout marche à l'éxécution jusqu'à l'affichage de la fonction !

    Ma fonction d'affichage :

    void afficher_liste(Liste* liste) {
    	if (liste == NULL) exit(EXIT_FAILURE);
    	Element *pointeur = liste->premier;
    	while (pointeur != NULL) {
    		printf("%d->",pointeur->nombre);
    		pointeur = pointeur->suivant;
    	}
    	printf("NULL\n");
    }


    Si la liste renvoie un pointeur égalant à NULL, elle devrait renvoyer "NULL\n" mais au lieu de ça j'ai une boucle infini se perdant dans la mémoire ( littéralement ) : 

    J'ai dû faire une erreur tout bête mais je ne vois pas, merci d'avance pour votre aide !

    • Partager sur Facebook
    • Partager sur Twitter
      13 juillet 2018 à 13:31:09

      Hello,

      Où mets-tu liste->premier à NULL pour indiquer que ta liste est vide ?

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        13 juillet 2018 à 15:14:33

        pourrais tu donner un code complet ou apparaît ton problème ?

        comme l'a dis  edgarjacobs tu free pas listeè->premier.

        maintenant ça fonctionne :

        #include <stdio.h>
        #include <stdlib.h>
        typedef struct _Element
        {
        	int nb;
        	struct _Element *suivant;
        }Element;
        
        typedef struct {
        	Element *premier;
        }Liste;
        
        void destroy(Liste *liste)
        {
        	Element *elem = liste->premier;
        	liste->premier = NULL;
        
        	while(elem != NULL)
        	{
        		Element *aSupprimer = elem;
        		elem = elem->suivant;
        		free ( aSupprimer );
        		aSupprimer = NULL;
        	}
        }
        
        void afficher_liste(Liste* liste)
        {
        	if (liste == NULL)
        		exit(1);
        
        	Element *pointeur = liste->premier;
        	while (pointeur != NULL)
        	{
        		printf("%d->",pointeur->nb);
        		pointeur = pointeur->suivant;
        	}
        	printf("NULL\n");
        }
        
        int main ( void )
        {
        	Liste liste;
        
        	Element *a, *b , *c;
        
        	a = malloc ( sizeof ( Element ) );
        	b = malloc ( sizeof ( Element ) );
        	c = malloc ( sizeof ( Element ) );
        
        	a->nb = 1;
        	a->suivant = b;
        
        	b->nb = 2;
        	b->suivant = c;
        
        	c->nb = 3;
        	c->suivant = NULL;
        
        	liste.premier = a;
        
        	afficher_liste ( &liste );
        	destroy ( &liste );
        	afficher_liste ( &liste );
        
        	return ( 0 );
        }
        valgrind ./a.out
        ==81217== Memcheck, a memory error detector
        ==81217== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
        ==81217== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
        ==81217== Command: ./a.out
        ==81217==
        1->2->3->NULL
        0x5204040
        (nil)
        
        NULL
        ==81217==
        ==81217== HEAP SUMMARY:
        ==81217==     in use at exit: 0 bytes in 0 blocks
        ==81217==   total heap usage: 4 allocs, 4 frees, 1,072 bytes allocated
        ==81217==
        ==81217== All heap blocks were freed -- no leaks are possible
        ==81217==
        ==81217== For counts of detected and suppressed errors, rerun with: -v
        ==81217== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
        



        -
        Edité par ox223252 13 juillet 2018 à 15:36:06

        • Partager sur Facebook
        • Partager sur Twitter

        la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

        Mon GitHub

          15 juillet 2018 à 9:13:46

          Dans la boucle, l'instruction

          aSupprimer = NULL;
          

          est totalement inutile.

          Donc nuisible. Ca laisse croire à celui qui relit que si elle est là, c'est qu'elle a une utilité, qu'il recherche donc, et ne risque pas de trouver.

          Bilan : pure perte de temps.



          -
          Edité par michelbillaud 15 juillet 2018 à 9:17:21

          • Partager sur Facebook
          • Partager sur Twitter
            16 juillet 2018 à 20:26:56

            Merci à tous pour vos réponses ! En effet je supprimais tous sauf le premier pointeur, le problème est résolu !

            Merci edgarjacobs et ox223252 !

            • Partager sur Facebook
            • Partager sur Twitter

            Liste chainées problème lors de la suppression

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown