Partage
  • Partager sur Facebook
  • Partager sur Twitter

Supprimer le 1er maillon d'une liste

    18 novembre 2022 à 14:48:58

    Bonjour, est ce que quelqu'un pourrait m'expliquer pourquoi ma fonction pour retirer le premier maillon d'une liste ne marche pas s'il vous plait ?

    Ma structure :

    #ifndef _LINKEDLIST_H_    		  	 		 		   		 
    #define _LINKEDLIST_H_    		  	 		 		   		 
        		  	 		 		   		 
    typedef struct Node    		  	 		 		   		 
    {    		  	 		 		   		 
        int value;    		  	 		 		   		 
        struct Node *next;    		  	 		 		   		 
    }Node;    		  	 		 		   		 
        		  	 		 		   		 
    typedef struct LinkedList    		  	 		 		   		 
    {    		  	 		 		   		 
        Node *first;    		  	 		 		   		 
        Node *last;    		  	 		 		   		 
        int size;    		  	 		 		   		 
    }LinkedList;    		  	 		 		   		 
        		  	 		 		   		 
    void displayLL(LinkedList* ll);    		  	 		 		   		 
    void appendToLL(LinkedList *ll, int value);    		  	 		 		   		 
    LinkedList* createLL();    		  	 		 		   		 
    void freeLL(LinkedList** ll);    		  	 		 		   		 
    void prependToLL(LinkedList* ll, int value);    		  	 		 		   		 
    int popFirstLL(LinkedList* ll, int* ptr_value);    		  	 		 		   		 
    #endif    		  	 		 		   		 



    Ma fonction :

    int popFirstLL(LinkedList* ll, int* ptr_value)    		  	 		 		   		 
    {    		  	 		 		   		 
        if (ll == NULL)    		  	 		 		   		 
            return 0;    		  	 		 		   		 
        		  	 		 		   		 
        ptr_value = ll->first->value;    		  	 		 		   		 
        		  	 		 		   		 
        if(ll->first == ll->last)    		  	 		 		   		 
        {    		  	 		 		   		 
            free(ll);    		  	 		 		   		 
            ll = NULL;    		  	 		 		   		 
            ll->size--;    		  	 		 		   		 
        		  	 		 		   		 
            return 1;    		  	 		 		   		 
        }    		  	 		 		   		 
        Node *toDelete = ll->first;    		  	 		 		   		 
        ll->first = ll->first->next;    		  	 		 		   		 
        ll->size--;    		  	 		 		   		 
        		  	 		 		   		 
        free(toDelete);    		  	 		 		   		 
        toDelete = NULL;    		  	 		 		   		 
        return 1;    		  	 		 		   		 
    }    		  	 		 		   		 

    Et voilà ce que j'obtiens en sortie :



    -
    Edité par stwr 18 novembre 2022 à 14:51:52

    • Partager sur Facebook
    • Partager sur Twitter
      18 novembre 2022 à 20:11:30

      Ligne suivante:
          ptr_value = ll->first->value;
      C'est un pointeur. Tu dois mettre * devant ...
      Si c'est le seul élement, tu détruis ta liste. Pourquoi?
      Mets first et last à NULL
      Tu auras une erreur en diminuant le size dans ce cas car l'espace est libéré.
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        19 novembre 2022 à 22:59:43

        PierrotLeFou a écrit:

        Ligne suivante:
            ptr_value = ll->first->value;
        C'est un pointeur. Tu dois mettre * devant ...
        Si c'est le seul élement, tu détruis ta liste. Pourquoi?
        Mets first et last à NULL
        Tu auras une erreur en diminuant le size dans ce cas car l'espace est libéré.

        Merci beaucoup, je pense que là c'est bon :

        int popFirstLL(LinkedList* ll, int* ptr_value)    		  	 		 		   		 
        {    		  	 		 		   		 
            if (ll->first == NULL)    		  	 		 		   		 
                return 0;    		  	 		 		   		 
            		  	 		 		   		 
            *ptr_value = ll->first->value;    		  	 		 		   		 
            		  	 		 		   		 
            if(ll->first == ll->last)    		  	 		 		   		 
            {    		  	 		 		   		 
                free(ll->first);    		  	 		 		   		 
                ll->first = NULL;    		  	 		 		   		 
                ll->last = NULL;    		  	 		 		   		 
                ll->size--;    		  	 		 		   		 
            		  	 		 		   		 
                return 1;    		  	 		 		   		 
            }    		  	 		 		   		 
            Node *toDelete = ll->first;    		  	 		 		   		 
            ll->first = ll->first->next;    		  	 		 		   		 
            ll->size--;    		  	 		 		   		 
            		  	 		 		   		 
            free(toDelete);    		  	 		 		   		 
            toDelete = NULL;    		  	 		 		   		 
            		  	 		 		   		 
            return 1;    		  	 		 		   		 
        }    		  	 		 		   		 




        • Partager sur Facebook
        • Partager sur Twitter
          20 novembre 2022 à 1:13:46

          Quand tu fais un pop, est-ce que tu veux supprimer le premier élément ou seulement le connaître?
          Si tu veut le supprimer, ça ne marchera pas s'il y a plusieurs éléments dans la liste., parce que tu ne supprimes rien
          Si tu veux seulement connaître, tu vas supprimer tout de même si la liste contient un seul élément.
          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            20 novembre 2022 à 20:47:19

            Je sais pas d'où sortent ces exercices, mais des phrases comme "mettre sa valeur dans ptr_value", quand les valeurs sont des int et ptr_value un pointeur d'entier, ça sent mauvais.

            Bon on va supposer que ça veut mettre sa valeur à l'endroit pointé par ptr_value.

            On peut prendre ça calmement en décomposant

            • soit la liste est vide et on retourne 0
            • soit on met la valeur du premier maillon à l'endroit demandé, on enlève le premier maillon, et on retourne 1
            personne n'interdit de s'aider de fonctions qui font les petites tâches
            int popFirstLL(LinkedList* ll, int* ptr_value)
            {
                 if (isEmptyLL(ll)) {
                      return 0;
                 } else {
                     *ptr_value = firstValue(ll);
                     removeFirstLL(ll);
                     return 1;
                 }
            }
            
            comme ça, on ne mélange pas les emmerdements spécifiques des différentes actions.
            • Partager sur Facebook
            • Partager sur Twitter

            Supprimer le 1er maillon d'une liste

            × 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