Partage
  • Partager sur Facebook
  • Partager sur Twitter

Liste Chaine, big bleme!!

....

    23 novembre 2007 à 22:57:52

    Voila, j'ai une fonction qui ne marche pas dans ma liste chainée, c'est lorsque je veux supprimer un element de la liste. il y une erreur, voila le code source :


    1. int Supprimer(noeud* debutListe, int x) {
    2.         noeud* unNoeud=debutListe;
    3.         noeud* temp;
    4.         if(!Rechercher(l,x)) return 0; // si L'element n'existe pas dans la liste, je retourne 0
    5.                 while(unNoeud->n!=x){
    6.                         unNoeud=unNoeud->suivant;
    7.         }
    8.         temp=unNoeud; // je met l'element a supprimer dans un pointeur temp
    9.         unNoeud=unNoeud->suivant; //
    10.         free(temp);
    11.         return 1; // SUprression réussi
    12. }


    Voila après avoir vérifié que le noeud existe dans la liste, je le cherche. et je l'affecte à un pointeur temporaire, puis j'accroche l'element suivant et je fais un "free" de l'element a supprimer.

    Mais j'ai ce message d'erreur : [b]"Heap corruption detected : after normal block...CRT detected that the application wrote to memory after end of heap buffer...[/b]

    Voila aidez moi comment faire pour supprimer un element de la liste.
    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2007 à 23:04:39

      Le titre ne correspond pas trop ...
      Sinon, envoie nous ton main(), sinon, on ne peux pas voir le programme en cours d'execution, et voir le bug ( en tout cas, pour moi )
      • Partager sur Facebook
      • Partager sur Twitter
        23 novembre 2007 à 23:05:56

        *noeud ?
        Ce serait pas plutôt noeud* ?
        Je ne suis pas sûre, mais je n'ai jamais vu nulle part :
        *type_pointé nom_pointeur...
        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2007 à 23:07:17

          C'est vrai que je me demander un truc comme sa, je vais relire le chapitre des pointeurs :-°
          • Partager sur Facebook
          • Partager sur Twitter
            23 novembre 2007 à 23:09:26

            Oui looool, en faite je me suis trompé en le recopiant..c'est pas le probleme. T'as pas à revoir tes pointeurslol merci
            • Partager sur Facebook
            • Partager sur Twitter
              23 novembre 2007 à 23:11:36

              Ok, ça tombe bien, je n'ai pas encore eu le temps ( phrase d'un gros flemmard, comme part hasard :-° )
              Je vais voir pour le reste.
              • Partager sur Facebook
              • Partager sur Twitter
                23 novembre 2007 à 23:12:52

                En faite le main() n'a rien de spécial, il y a juste un pointeur qui pointe sur le debut de la liste, que j'envoie en paramettre, et dans la fonction je parcours la liste pour trouver l'element à supprimer.
                • Partager sur Facebook
                • Partager sur Twitter
                  23 novembre 2007 à 23:18:46

                  Si j'ai bien compris, le pointeur unNoeud te permet de parcourir ta liste jusqu'à pointer sur l'élément à supprimer.

                  Sauf que le chainage que tu fais ne convient pas, il me semble. Supposons que tu veuilles supprimer le 5 dans la chaine suivante:
                  1 -> 7 -> 5 -> 3 -> 8

                  Tu fais parcourir ton pointeur UnNoeud jusqu'à ce qu'il pointe sur 5, ok. Mais le chainage que tu dois faire c'est :
                  le suivant de 7 devient 3, c'est-à-dire le suivant de 7 reçoit le suivant de unNoeud. Or tu ne gardes nulle part l'adresse de la cellule qui contient 7... ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 novembre 2007 à 23:20:34

                    Avez vous un tuto, qui montre comment suprrmier un element d'une liste(en plein millieu de la liste par exmple).

                    La difficulté je pense c'est d'affecter sur le suivant du pointeur qui précede l'elemet à supprimer le pointeur de l'element qui suit l'element a supprimer...


                    EDIT : Exactement toupi, je me doutais que ça venait de la, mais je ne sais pas trop comment faire. Est ce que mon chainage est tout simplement faut, aurait- tu une alternative?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 novembre 2007 à 23:26:03

                      J'ai trouvé ce code sur un site :
                      1. void suppr_suivant(adr_comp *prec)
                      2. {
                      3.   adr_comp a_virer;
                      4.   if(prec==NULL || prec->suiv==NULL)
                      5.     {puts("rien à supprimer" );return;}
                      6.   a_virer=prec->suiv;
                      7.   prec->suiv=a_virer->suiv;
                      8.   free(a_virer);
                      9. }
                      10. void suppr_premier(adr_comp *prem)
                      11. {
                      12.   adr_comp a_virer;
                      13.   if(prem==NULL) {puts("rien à supprimer" );return;}
                      14.   a_virer=prem;
                      15.   prem=prem->suiv;
                      16.   free(a_virer);
                      17. }
                      18. void suppr_tout(adr_comp *prem)
                      19. /* attention : ne met pas NULL dans prem qui pointe donc toujours sur la liste, qui n'est plus allouée mais dont le contenu n'a peut-être pas changé */
                      20. {
                      21.   adr_comp deuxieme;
                      22.   while(prem!=NULL)
                      23.    {
                      24.     deuxieme=prem->suiv;
                      25.     free(prem);
                      26.     prem=deuxieme;
                      27.    }
                      28. }


                      Il parait qu'il marche, je ne l'ai pas testé.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 novembre 2007 à 23:36:39

                        Xhtml_boys, ne conseille pas un code que tu n'as testé, surtout si tu n'en cite pas les sources et que tu ne t'y connais pas assez pour savoir s'il fonctionne ou pas.

                        En tapant developpez.com+liste+chainée sur google, on arrive ici comme premier lien, très bien expliqué et correct de façon sure et certaine (j'ai appris les listes là-dessus ;))
                        http://nicolasj.developpez.com/articles/listesimple/#LIII-E
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 novembre 2007 à 23:47:44

                          j'ai oublier de mettre la source du code : source
                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 novembre 2007 à 23:49:38

                            Ok merci, je vais voir tout ça :)
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Liste Chaine, big bleme!!

                            × 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