Exercice : Fonctions d’édition#
Il s’agit maintenant de définir les fonctions de base permettant de modifier une liste, c’est-à-dire ajouter et supprimer des éléments. De nombreuses fonctions de ce type sont possibles et chacune a son utilité. Nous nous contenterons ici des plus simples permettant de manipuler un minimum nos listes.
Définissez une fonction permettant d’ajouter un élément donné en paramètre en tête d’une liste. L’ajout en tête est souvent le type d’ajout le plus simple et le plus rapide pour les listes simplement chaînées.
void ajouter_en_tete(liste *l, int val);
BEGIN SOLUTION
void ajouter_en_tete(liste *l, int val) { elem *e = (elem *)malloc(sizeof(elem)); e->val = val; e->next = l->tete; l->tete = e; l->nbelem++; }
Attention de ne pas inverser les affectations
e->next = l->teteetl->tete = e.END SOLUTION
Définissez maintenant une fonction permettant de chercher la première occurence d’une valeur dans une liste et de la supprimer. Cette fonction de suppression n’est pas la plus courante pour les listes chaînée mais elle nous sera bien utile plus tard et se combine bien avec la fonction que nous allons définir à la prochaine question.
void supprimer_valeur(liste *l, int val);
Attention
Les choses se compliquent avec cette fonction, pensez à bien la tester: les cas limites sont ici importants et plus nombreux.
BEGIN SOLUTION
void supprimer_valeur(liste *l, int val) { if (l->nbelem == 0) return; elem *e = l->tete; if (e->val == val) { l->tete = e->next; l->nbelem--; free(e); return; } while (e->next != NULL) { if (e->next->val == val) { elem *tmp = e->next; e->next = tmp->next; l->nbelem--; free(tmp); return; } e = e->next; } }
END SOLUTION
Testez de façon extensive toutes les fonctions écrites jusque là. Pour la fonction de suppression, vérifiez que vous avez testé tous les cas limites, dont suppression du premier élément, du dernier élément, et d’un élément qui n’est ni le premier ni le dernier. Testez aussi les enchaînements des diverses fonctions, par exemple ajoutez un bon nombre d’élements, puis supprimez-en une bonne partie, puis ajoutez-en à nouveau, et affichez et vérifiez la liste à diverses étapes.