Partie Bonus - Gregory-Marquiset/gm_libft GitHub Wiki

Fonctions Bonus de la Libft

Cette section couvre les fonctions bonus de la bibliothèque Libft. Chaque fonction est décrite en détail pour fournir une compréhension claire de son utilité, de sa logique, et de son contexte d'utilisation.


🛠️ Création et manipulation de listes chaînées

ft_lstnew

  • Prototype :

    t_list *ft_lstnew(void *content);
    
  • But de la fonction : La fonction ft_lstnew alloue (avec malloc) et retourne un nouvel élément de liste. Le membre content est initialisé avec la valeur du paramètre content. Le membre next est initialisé à NULL.

  • Contexte d'utilisation : Utile pour créer un nouvel élément de liste chaînée, servant de point de départ pour une nouvelle liste ou à ajouter à une liste existante.

  • Logique du code :

  1. Allouer de la mémoire pour un nouvel élément de type t_list.
  2. Initialiser le membre content avec la valeur fournie en paramètre.
  3. Initialiser le membre next à NULL pour indiquer que cet élément ne pointe vers aucun autre.
  4. Retourner le pointeur vers le nouvel élément.

ft_lstadd_front

  • Prototype :

    void ft_lstadd_front(t_list **lst, t_list *new);
    
  • But de la fonction : La fonction ft_lstadd_front ajoute l'élément new au début de la liste pointée par lst.

  • Contexte d'utilisation : Utile pour insérer un nouvel élément en tête d'une liste chaînée, modifiant ainsi le point d'entrée de la liste.

  • Logique du code :

  1. Vérifier que les pointeurs lst et new ne sont pas NULL.
  2. Faire pointer le membre next de new vers l'ancien premier élément de la liste.
  3. Mettre à jour le pointeur lst pour qu'il pointe vers new, faisant de lui le nouveau premier élément.

ft_lstadd_back

  • Prototype :

    void ft_lstadd_back(t_list **lst, t_list *new);
    
  • But de la fonction : La fonction ft_lstadd_back ajoute l'élément new à la fin de la liste pointée par lst.

  • Contexte d'utilisation : Utile pour ajouter un nouvel élément à la fin d'une liste chaînée, étendant ainsi la liste sans modifier son début.

  • Logique du code :

  1. Vérifier que les pointeurs lst et new ne sont pas NULL.
  2. Si la liste est vide (*lst est NULL), assigner new comme premier élément.
  3. Sinon, parcourir la liste jusqu'au dernier élément.
  4. Faire pointer le membre next du dernier élément vers new.

ft_lstsize

  • Prototype :

    int ft_lstsize(t_list *lst);
    
  • But de la fonction : La fonction ft_lstsize compte le nombre d'éléments dans la liste pointée par lst.

  • Contexte d'utilisation : Utile pour déterminer la longueur d'une liste chaînée, par exemple pour des opérations nécessitant la connaissance du nombre d'éléments.

  • Logique du code :

  1. Initialiser un compteur à zéro.
  2. Parcourir la liste en incrémentant le compteur pour chaque élément rencontré.
  3. Retourner la valeur du compteur après avoir traversé la liste.

ft_lstlast

  • Prototype :

    t_list *ft_lstlast(t_list *lst);
    
  • But de la fonction : La fonction ft_lstlast retourne le dernier élément de la liste pointée par lst.

  • Contexte d'utilisation : Utile pour accéder rapidement au dernier élément d'une liste chaînée, notamment avant d'ajouter un nouvel élément à la fin.

  • Logique du code :

  1. Vérifier que lst n'est pas NULL.
  2. Parcourir la liste jusqu'à atteindre l'élément dont le membre next est NULL.
  3. Retourner un pointeur vers cet élément, qui est le dernier de la liste.

🧹 Gestion mémoire et itération des listes chaînées

ft_lstdelone

  • Prototype :

    void ft_lstdelone(t_list *lst, void (*del)(void *));
    
  • But de la fonction : La fonction ft_lstdelone libère la mémoire d'un élément de liste chaînée en utilisant la fonction del pour libérer le contenu, puis en libérant l'élément lui-même. Le champ next de l'élément n'est pas affecté.

  • Contexte d'utilisation : Utile pour supprimer un élément spécifique d'une liste chaînée sans affecter les autres éléments, notamment lors de la gestion dynamique de structures de données.

  • Logique du code :

  1. Vérifier que l'élément lst et la fonction del ne sont pas NULL.
  2. Appliquer la fonction del au contenu de l'élément (lst->content) pour le libérer.
  3. Libérer la mémoire de l'élément lui-même en utilisant free(lst).
  4. Ne pas toucher au champ next de l'élément, car il ne doit pas être libéré.

ft_lstclear

  • Prototype :

    void ft_lstclear(t_list **lst, void (*del)(void *));
    
  • But de la fonction : La fonction ft_lstclear supprime et libère la mémoire de l'élément pointé par lst et de tous ses successeurs, en utilisant la fonction del pour le contenu, puis en libérant chaque élément. Enfin, le pointeur initial est mis à NULL.

  • Contexte d'utilisation : Utile pour vider entièrement une liste chaînée et libérer toutes les ressources associées, par exemple lors de la réinitialisation de structures de données ou avant de quitter un programme pour éviter les fuites de mémoire.

  • Logique du code :

  1. Vérifier que le pointeur lst et la fonction del ne sont pas NULL.
  2. Parcourir la liste :
    • Sauvegarder le pointeur vers l'élément suivant.
    • Utiliser ft_lstdelone pour supprimer l'élément actuel en appliquant del à son contenu.
    • Passer à l'élément suivant en utilisant le pointeur sauvegardé.
  3. Après la boucle, mettre le pointeur initial lst à NULL pour indiquer que la liste est vide.

ft_lstiter

  • Prototype :

    void ft_lstiter(t_list *lst, void (*f)(void *));
    
  • But de la fonction : La fonction ft_lstiter parcourt la liste lst et applique la fonction f au contenu de chaque élément.

  • Contexte d'utilisation : Utile pour effectuer une opération sur chaque élément d'une liste chaînée, comme l'affichage des contenus, la modification des données ou l'application d'une transformation spécifique.

  • Logique du code :

  1. Vérifier que le pointeur lst et la fonction f ne sont pas NULL.
  2. Parcourir chaque élément de la liste :
    • Appliquer la fonction f au contenu de l'élément (lst->content).
    • Passer à l'élément suivant (lst = lst->next).
  3. Continuer jusqu'à ce que la fin de la liste soit atteinte (lst devient NULL).

ft_lstmap

  • Prototype :

    t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *));
    
  • But de la fonction : La fonction ft_lstmap parcourt la liste lst, applique la fonction f au contenu de chaque élément, et crée une nouvelle liste résultant des applications successives de f. La fonction del est utilisée pour supprimer le contenu d'un élément en cas d'échec.

  • Contexte d'utilisation : Utile pour créer une nouvelle liste chaînée en transformant les contenus de la liste existante selon une fonction donnée, tout en gérant proprement les erreurs potentielles liées à l'allocation de mémoire.

  • Logique du code :

  1. Vérifier que les pointeurs lst, f et del ne sont pas NULL.
  2. Initialiser un pointeur pour la nouvelle liste (new_list) à NULL.
  3. Parcourir chaque élément de la liste originale :
    • Appliquer la fonction f au contenu de l'élément actuel.
    • Créer un nouvel élément avec le contenu transformé en utilisant ft_lstnew.
    • Si la création échoue, utiliser ft_lstclear avec del pour nettoyer la nouvelle liste et retourner NULL.
    • Ajouter le nouvel élément à la fin de la nouvelle liste en utilisant ft_lstadd_back.
  4. Continuer jusqu'à la fin de la liste originale.
  5. Retourner le pointeur vers la nouvelle liste.