dj_titeuf a écrit :
Bonsoir,
A partir du code suivant, je ne comprends pas pourquoi à l'exécution du programme aucun affichage ne se fait. Pouvez-vous m'expliquer svp? Deuxième question: quelle est l'utilité de créer iter, pourquoi ne pas se contenter de list? Merci d'avance!
Code :
- void ajouter (struct elem *list, int i){
- struct elem * e;
- e=malloc(sizeof(struct elem));
- e->i=i;
- e->next= list;
- }
|
|
Ouch cte horreur !!!
Chaque fois que la fonction est appelée, elle alloue de la mémoire et stocke l'adresse allouée dans une variable locale qui n'est perdue en fin de fonction => fuite mémoire assurée
Quand à ta question 2 c'est presque la même raison. Si tu modifies list ben tu perds ton pointeur de début.
Maintenant, si vraiment tu veux faire des listes de façon correcte, alors je te conseille la méthode suivante : tu crées une structure permettant de tenir la liste. La structure peut très bien ne tenir que le pointeur de début ce n'est pas grave. Ca peut paraître idiot de créer une structure juste pour un pointeur mais ensuite, rien ne t'empêche de rajouter d'autres éléments comme par exemple
- le nombre de chainons
- le pointeur en cours de traitement
- un pointeur de fin (pour la parcourir dans l'autre sens)
etc
Si tu prévois dès le début ce genre de cas, tu auras moins de travail plus tard pour faire évoluer ton code. Et en plus ça t'évitera de passer par des pointeurs de pointeurs lorsque tu devras modifier un élément
Ensuite tu crées des fonctions très basiques permettant
- d'ajouter un élément
- en enlever
- afficher
etc etc
Ensuite, dans ton programme principal, tu n'as plus qu'à appeler la fonction qui va bien quand t'en as besoin.
Un exemple pour débuter
Code :
typedef struct s_elem { int i; s_elem *next; } t_elem; typedef struct { t_elem *first; } t_liste; void init(t_liste *l) { l->first=NULL; } void freeListe(t_liste *l) { t_elem *pt; if (l->first == NULL) return; for (pt=l->first; pt->next != NULL; pt=pt->next) free(pt); l->first=NULL; } int main() { t_liste maListe; init(&maListe); ... freeListe(&maListe); }
|
Message édité par Sve@r le 12-10-2009 à 22:11:33
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.