http://nicolasj.developpez.com/articles/listesimple/
Vous pouvez laisser un commentaire sur cet article à la suite.Les structures de données en C.
Première partie : les listes simplement chaînées.
http://nicolasj.developpez.com/articles/listesimple/
Vous pouvez laisser un commentaire sur cet article à la suite.Les structures de données en C.
Première partie : les listes simplement chaînées.
Envoyé par Klodo
Merci pour ce boulot, qui m'a bien aidé.
Il n'est pas evident de trouver de bons cours sur les listes chainees.
Merci beaucoup a l'auteur
Bonjour,
Un grand merci pour ce tutoriel.
Je me pose les questions suivantes :
1) Pourquoi certains pointeurs ne commence pas par p_ dans les structures ? En fait il n y a que p_start qui commence par ce préfixe
2) J'ai du mal à comprendre le code suivant :
Ne saute t on pas l’élément de type item_s créé par sll_new (p_l)
Code : Sélectionner tout - Visualiser dans une fenêtre à part p_sll->p_start->next = p_n;
Pour moi p_start->next signifie que p_l->next pointe sur p_n. Donc p_l->data est toujours NULL ?
Merci d'avance.
El_condor
Oui, je trouve ce tuto très bien pour les listes chaînées.
Les images sont bien claires, le texte est suffisant et le code est bien détaillé.
Bonjour,
c'est un bon tutoriel mais les fonctions de suppression proposées entrainent un risque de fuite mémoire, puisque les données stockées ne sont jamais libérées. Un petit pointeur sur fonction ?
Par ailleurs, je profiterais de la structure sll_s pour stocker la taille de la liste et un pointeur sur le dernier élement, afin d'éviter d'avoir à la parcourir en entier.
Lorsque l'on libère un pointeur sur une chaine, ne libère t on pas tout l'ensemble ?c'est un bon tutoriel mais les fonctions de suppression proposées entrainent un risque de fuite mémoire, puisque les données stockées ne sont jamais libérées. Un petit pointeur sur fonction ?
Deuxième remarque :
Il manque une condition. En effet, si la liste vient d'être créée, alors (*pp_sll)->list->next != NULL ne peut être verifié car list = null.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void sll_delete (sll_s ** pp_sll) { if (pp_sll && *pp_sll) { sll_first (*pp_sll); while ((*pp_sll)->list->next != NULL) { sll_removeNext (*pp_sll); } sll_removeFirst (*pp_sll); free ((*pp_sll)->list); (*pp_sll)->list = NULL; free (*pp_sll), *pp_sll = NULL; } }
En effet :
Il faut alors rajouter la condition suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 sll_s *sll_new (void) { sll_s *p_sll = malloc (sizeof *p_sll); if (p_sll) { item_s *p_l = malloc (sizeof *p_l); if (p_l) { p_l->data = NULL; p_l->next = NULL; p_sll->p_start = p_l; p_sll->list = NULL; } else { fprintf (stderr, "Memoire insufisante\n"); exit (EXIT_FAILURE); } } else { fprintf (stderr, "Memoire insufisante\n"); exit (EXIT_FAILURE); } return p_sll; }
if((*pp_sll)->p_list != NULL) avant le while.
J'en ai fait l’expérience tout à l'heure en voulant créer un répertoire.
Cordialement
El_condor
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager