Pointeur sur structure

Pointeur sur structure - C - Programmation

Marsh Posté le 29-10-2005 à 22:23:51    

Bonjour a tous !
 
Voila, je debute en C depuis septembre. On a vu il y a qqs jours les structures...  
J'ai donc essaye d'ecrire une version (simplifiee) d'un arbre binaire(trie) sous forme de liste chainee
Voici la structure :
 
struct uneStruct {
 int element;
 struct uneStruct * arbreL;
 struct uneStruct * arbreR;
} arbreBinaire;
 
J'ai une methode void inserer (struct uneStruct * arbre, int elt)
 
Dans cette methode, je veux acceder a element et au deux autres arbres mais je n'y arrive pas.  
Pour y acceder, j'ecris        arbreBinaire->element  
mais je me rend compte que je manipule les adresses et non le contenu des variables.
Comment puis je resoudre ce probleme?

Reply

Marsh Posté le 29-10-2005 à 22:23:51   

Reply

Marsh Posté le 29-10-2005 à 22:29:51    

Code :
  1. typedef struct uneStruct {
  2. int element;
  3. struct uneStruct* arbreL;
  4. struct uneStruct* arbreR;
  5. } uneStruct;
  6. uneStruct arbreBinaire;
  7. void inserer(uneStruct* arbre, int elt)
  8. {
  9.    arbre->element = 42; /* acces à l'element */
  10.    arbre->arbreL = ... ; /* acces à l'arbre gauche */
  11.    arbre->arbreR = ... ; /* acces à l'arbre droit */
  12. }


A propos du typedef : en C on évite de se trainer des struct partout alors on utilise typedef. En C++ ce mécanisme est devenu automatique.

Reply

Marsh Posté le 29-10-2005 à 22:42:33    

ton affirmation sur le typedef est gratuite. Certains préfèrent n'utiliser typedef que pour des types opaques ou des types intégrés et veulent conserver le 'struct' pour ne rien cacher de la nature de la variable. Linux suit cette ligne.

Reply

Marsh Posté le 29-10-2005 à 22:52:27    

ouais quand je dit "on evite", on c'est pas tout le monde. Mais sauf à le vouloir explicitement, il me semble que c'est mieux. Comme il débute, j'ai pensé qu'il utilisait struct uneStruct parce qu'il ne connaissait pas typedef.
Ou parce que son prof est un puriste :D
maintenant avec les éditeur modernes t'as plus besoin de tracer la nature des types, tu peux le demander à ton IDE. C'est comme la notation hongroise autrefois chère à microsoft avec i devant les int, sz devant les chaines... C'est lourd, dépassé et inutile maintenant.
Maintenant ceux qui codent avec VI bon ben ils assument :sarcastic:

Reply

Marsh Posté le 29-10-2005 à 22:57:26    

moi j'ai jamais trop compris cette parano du typedef. Je me souviens surtout des embrouilles quand j'ai appris le C : c'était toujours le bordel savoir où mettre le typedef, etc

Reply

Marsh Posté le 30-10-2005 à 10:59:19    

un exemple classqiue :

Code :
  1. typedef double[2] point;


point est un tableau de 2 double... faux ! la bonne syntaxe est contre-intuitive :

Code :
  1. typedef double point[2];

Reply

Marsh Posté le 30-10-2005 à 16:40:32    

Merci pour vos reponses mais j'ai toujours un probleme... bon je vous montre le code, ca sera plus simple.

Code :
  1. void inserer (struct uneStruct * arbre, int elt) {
  2. // printf("arbre->element : %d", arbre->element); Debugage
  3. if (arbre->element == 0)
  4. { arbre->element = elt;
  5.  return;
  6. }
  7. if (arbre->element < elt)
  8. {
  9.  if (arbre->arbreR != NULL)
  10.  { inserer(arbre->arbreR, elt);
  11.   return;
  12.  }
  13. arbre->arbreR = (struct uneStruct *)malloc(sizeof(struct uneStruct));
  14. inserer(arbre->arbreR, elt);
  15. return;
  16. }
  17. else
  18. {
  19.  if (arbre->arbreL != NULL)
  20.  { inserer(arbre->arbreL, elt);
  21.   return;
  22.  }
  23. arbre->arbreL = (struct uneStruct *)malloc(sizeof(struct uneStruct));
  24. inserer(arbre->arbreL, elt);
  25. return;
  26. }
  27. }


Voila ...
En fait, quand j'imprime arbre->element  eh ben ce n'est pas 2 (par exemple), c'est l'adresse de l'entier.
 
A propos du typedef, on l'a vu mais on ne l'utilise pas (pour le moment). On nous l'a conseille surtout pour les declarations de types complexes.  
Pour le moment je teste les struct et apres je continuerai avec les unions et les enumeres.

Reply

Marsh Posté le 30-10-2005 à 18:56:37    

JusteMoiDeRetour a écrit :

En fait, quand j'imprime arbre->element  eh ben ce n'est pas 2 (par exemple), c'est l'adresse de l'entier.


 
Pourquoi dis-tu ça ?
Si ça t'affiche une valeur à coucher dehors, c'est peut-être qu'il te manque une initialisation quelque part...

Reply

Sujets relatifs:

Leave a Replay

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