Structures, pointeurs..affichage?

Structures, pointeurs..affichage? - C - Programmation

Marsh Posté le 11-10-2009 à 04:07:10    

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 :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct elem {
  4.   int i;
  5.   struct elem * next;
  6. };
  7. void ajouter (struct elem *list, int i){
  8.   struct elem * e;
  9.   e=malloc(sizeof(struct elem));
  10.   e->i=i;
  11.   e->next= list;
  12. }
  13. int main(){
  14.   struct elem * list=NULL;
  15.   struct elem* iter=NULL;
  16.   int i;
  17.   ajouter (list,1);
  18.   ajouter (list,2);
  19.   ajouter (list,3);
  20.   iter=list;
  21.   for (i=0;i<2;i++){
  22.     if (iter) {
  23.       printf("%d ",iter->i);
  24.       iter=iter->next;
  25.     }
  26.   }
  27.   return 0;
  28. }


Reply

Marsh Posté le 11-10-2009 à 04:07:10   

Reply

Marsh Posté le 11-10-2009 à 14:49:14    

ajoute doit prendre un pointeur de pointeur sinon tu ne modifie qu'une copie local de list.

Reply

Marsh Posté le 12-10-2009 à 22:11:12    

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 :
  1. void ajouter (struct elem *list, int i){
  2.   struct elem * e;
  3.   e=malloc(sizeof(struct elem));
  4.   e->i=i;
  5.   e->next= list;
  6. }



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 :
  1. typedef struct s_elem {
  2.    int i;
  3.    s_elem *next;
  4. } t_elem;
  5.  
  6. typedef struct {
  7.    t_elem *first;
  8. } t_liste;
  9.  
  10. void init(t_liste *l)
  11. {
  12.    l->first=NULL;
  13. }
  14.  
  15. void freeListe(t_liste *l)
  16. {
  17.    t_elem *pt;
  18.    if (l->first == NULL) return;
  19.  
  20.    for (pt=l->first; pt->next != NULL; pt=pt->next)
  21.        free(pt);
  22.    l->first=NULL;
  23. }
  24.  
  25. int main()
  26. {
  27.    t_liste maListe;
  28.    init(&maListe);
  29.    ...
  30.    freeListe(&maListe);
  31. }


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.
Reply

Marsh Posté le 13-10-2009 à 20:09:51    

Ok, merci pour ta réponse, je pense avoir saisi! :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed