Question "basique" C

A

Anonyme

Invité
Salut à tous.

Il y a de nombreuses années, je me débrouillais en C, mais toutes mes connaissances sont parties aux oubliettes avec ma mémoire de poisson rouge.

J'ai donc voulu m'y remettre pour créer un petit programme qui crée un arbre tout simple!


Le code de base ne fonctionne pas et j'aurais besoin de conseils. Je pense qu'un programmeur averti me sortira de mon mauvais trou en quelques minutes.


Voici mon code ( qui ne fait rien pour l'instant, j'aimerais juste définir mon arbre!

Bloc de code:
#include <stdlib.h>
#include <stdio.h>

struct noeud{
  struct noeud * fils_gauche;
  struct noeud * fils_droit;
  int data; // je stocke un entier dans chaque noeud de l'arbre
};

typedef noeud * arbre;

void ajouter_fils_gauche(noeud * r,int x){
  r->fils_gauche = (struct noeud *)calloc(1,sizeof(struct noeud));
  r->fils_gauche->data = x;
}

void ajouter_fils_droit(noeud * r,int x){
  r->fils_droit = (struct noeud *)calloc(1,sizeof(struct noeud));
  r->fils_droit->data = x;
}

void afficher_arbre(arbre a){
  printf("%d\n",x)
  if (a->fis_grauche) afficher_arbre(a->fils_gauche);
  if (a->fils_droit) afficher_arbre(a->fils_droit);
}

int main()
{
printf ("hello world\n");
// Je vais insérer ici le code pour gérer mon arbre, mais aimerais d'abord régler les petits problemes de code
return 0;
}
Les erreurs qui me posent probleme:

-> à la ligne: typedef noeud * arbre;

Tof.c:10: error: syntax error before ‘*’ token
Tof.c:10: warning: data definition has no type or storage class



-> à la ligne: void ajouter_fils_gauche(noeud * r,int x){

Tof.c:12: error: syntax error before ‘*’ token
Tof.c: In function ‘ajouter_fils_gauche’:



Merci à ceux qui pourront me rafraichir la mémoire...
 

tatouille

Membre expert
1 Juin 2004
5 174
493
Stanford CA
Bloc de code:
--- t0    2009-04-24 12:45:04.000000000 -0700
+++ t1    2009-04-24 12:44:38.000000000 -0700
@@ -7,21 +7,21 @@
   int data; // je stocke un entier dans chaque noeud de l'arbre
 };
 
-typedef noeud * arbre;
+typedef struct noeud * arbre;
 
-void ajouter_fils_gauche(noeud * r,int x){
+void ajouter_fils_gauche(struct noeud * r,int x){
   r->fils_gauche = (struct noeud *)calloc(1,sizeof(struct noeud));
   r->fils_gauche->data = x;
 }
 
-void ajouter_fils_droit(noeud * r,int x){
+void ajouter_fils_droit(struct noeud * r,int x){
   r->fils_droit = (struct noeud *)calloc(1,sizeof(struct noeud));
   r->fils_droit->data = x;
 }
 
 void afficher_arbre(arbre a){
-  printf("%d\n",x)
-  if (a->fis_grauche) afficher_arbre(a->fils_gauche);
+  //printf("%d\n",x)
+  if (a->fils_gauche) afficher_arbre(a->fils_gauche);
   if (a->fils_droit) afficher_arbre(a->fils_droit);
 }
mais bon a part ce makeup rapide il y a beaucoup de chose a revoir

:zen:
 
A

Anonyme

Invité
mais bon a part ce makeup rapide il y a beaucoup de chose a revoir

:zen:

Génial merci! Il manquait juste les "struct"...

Oui, je sais qu'il y a beaucoup à revoir, mais on a tous commencé à programmer un jour non? :rateau:

Je me concentre d'abord sur le principe de faire fonctionner mon programme de base, on avisera apres lol
 

tatouille

Membre expert
1 Juin 2004
5 174
493
Stanford CA
:D de rien, ca ma pris 2 minutes de mon temps :D, mais ce message aurait du te mettre sur la piste:

data definition has no type or storage class

le compiler se plaint de ne pas trouver un type pour une definition il ne sait pas comment traiter ceci
 
A

Anonyme

Invité
:D de rien, ca ma pris 2 minutes de mon temps :D, mais ce message aurait du te mettre sur la piste:

data definition has no type or storage class

le compiler se plaint de ne pas trouver un type pour une definition il ne sait pas comment traiter ceci

Bien oui, mais je pensais que le type, c'était "noeud", puisqu'il est défini au dessus...

Je pensais que je lui avais défini un type, ce qui n'est effectivement pas le cas!
 

tatouille

Membre expert
1 Juin 2004
5 174
493
Stanford CA
oui c'est pour cela qu'il existe le keyword typedef, node est la definition d'une var de type struct

tree_t est un type qui pointe sur une var de type struct

Bloc de code:
struct node {
     struct node *l_child;
     struct node *r_child;
     int val;
};

typedef struct node * tree_t;
mais perso j'ecrirais ca

Bloc de code:
typedef struct node * tree_t;

struct node {
   tree_t *l_children;
   tree_t *r_children;
   int val;
};

void tree_new(tree_t *newtree); // malloc &newtree
void tree_add_child(tree_t tree, int where, int val); // realloc
void tree_free(tree_t tree); // for each member in the tree -> free(member)
pour les question de memoire et d'allocation voici un exemple que j'ai ecris qui repond a ton probleme

note la difference entre

tree.l_children et tree->l_children