[C]Problème de pointeurs

Résolu/Fermé
Nieli Messages postés 83 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 23 avril 2009 - 9 avril 2009 à 19:45
Nieli Messages postés 83 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 23 avril 2009 - 9 avril 2009 à 21:42
Bonjour,
J'essaye d'implémenter des Arbres binaires par position en C.
Mon problème est que je n'arrive pas à trouver ce qu'il faut utiliser ((*a),&a, *a etc x_X) pour que l'arbre modifié par la fonction inserer_aux soit transmis à inserer et au main.

Voilà mon code :

/*Structure de données: Arbre binaire de recherche*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>


/* Définition de la structure Noeud d'un arbre*/


typedef struct Noeud{
  void *data;
  struct Noeud* fils_gauche;
  struct Noeud* fils_droit;
  int taille;
} *Arbre;





Arbre inserer_aux (void *v, Arbre *ap, int pos)
{
  Arbre a=*ap;
  if (a==NULL)
    {
      a = (Arbre)malloc(sizeof(struct Noeud));
      a->taille = 1;
      a->fils_gauche = NULL;
      a->fils_droit = NULL;
      a->data = v;
      fprintf(stdout,"Valeur Ajoutée à l'arbre : %d\n",(int)a->data);
      return a;
    }
   else
    {
      if(pos <= a->fils_gauche->taille)
	{
	  a->fils_gauche = (Arbre)inserer_aux(v,&a->fils_gauche,pos);
	  a->taille++;
	  return a;
	}
      else
	{
	  a->fils_droit = (Arbre)inserer_aux(v,&a->fils_droit,pos-a->fils_gauche->taille-1);
	  a->taille++;
	  return a;
	}
    }
}

void inserer (void *v, Arbre *ap, int pos)
{
  Arbre a=*ap;
  assert(a==NULL || 0 <= pos && pos <= a->taille);
  inserer_aux(v,ap,pos);
}



int main(int argc, char *argv[])
{
  Arbre *a =(Arbre*)malloc(sizeof(struct Noeud));
  inserer((void *)5,a,0);
  inserer((void *)2,a,0);
  Arbre ap = *a;
  if(ap==NULL) printf("test\n");
  return 0;
}






Voilà, si vous pouvez m'aider...n'hésitez pas.

Merci d'avance,

Nieli.

2 réponses

Bon j'ai pas tout lu mais je vois une erreur de taille:
inserer((void*)5 ,a, 0);
(void*)5 ---> Erreur de manipulation de pointeur, probablement un plantage assuré et pour le moins ce ne sera pas l'effet escompté.
(void*)5 ---> Quelle est la signification? On passe un pointeur dont la valeur est 5, c'est-à-dire que le pointeur désigne la case mémoire n° 5, ce qui ici n'a aucun sens (bien sûr la case n° 5 existe, ça fait partie de la table des pointeurs d'interruption (sauf expert: ne pas toucher, ça brûle !!!)).
Il faut donc écrire quelque chose du genre:
int w=5;
inserer((void*)&w, a, 0);

Mais évidemment il faudra faire attention à ce que le 'w' reste défini sinon il faut plutôt écrire:
int* w;
w = (int*)malloc(sizeof(int));
w = 5;
inserer((void*)w, a, 0);


D'autre part:
a->fils_gauche = (Arbre)inserer_aux(v,&a->fils_gauche,pos);
peut s'écrire plus simplement:
a->fils_gauche = inserer_aux(v,&a->fils_gauche,pos);.
Bon courage
0
Nieli Messages postés 83 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 23 avril 2009 6
9 avril 2009 à 21:42
Bonsoir(mnt),

Merci de t'être interressé à mon problème.
Mon idée était plutôt de faire quelque chose comme ça
Il est toutefois possible de définir un pointeur sur 'void', c'est-à-dire sur quelque chose qui n'a pas de type prédéfini (void * toto). Ce genre de pointeur sert généralement de pointeur de transition, dans une fonction générique, avant un transtypage permettant d'accéder effectivement aux données pointées

(Tiré de CCM).

Pour pouvoir passer n'importe quel type d'objet.

Sinon, pourrais-tu m'expliquer pourquoi
Arbre *a = (Arbre *)malloc(sizeof(struct Noeud));
printf("Main: %p\n",a);
Arbre *ab = a;
printf("Main: %p\n",&ab);

Pourquoi les adresses sont elles différentes? Je comprends vraiment pas :/

Merci d'avance,

Nieli
0