IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Erreur implémentation d'arbre binaire de recherche.


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2011
    Messages : 2
    Par défaut Erreur implémentation d'arbre binaire de recherche.
    Bonjour,

    j'essaye d'implémenter un arbre binaire de recherche avec quelques opérations. Je n'ai presque aucunes expériences en c (et en programmation en général). Donc les erreurs que j'ai fais sont sûrement de "bête erreurs" mais je n'arrive pas à les corriger.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    struct node {
    	struct node *lChild; //Pointeur vers le fils gauche.
    	struct node *rChild; //Pointeur vers le fils droit.
    	int value; //Valeur, ou cle, du noeud.
    };
     
    struct tree {
    	struct node *root; //Pointeur vers l'element racine;
    };
     
    struct tree* constructNewTree()
    {
    	//Fonction qui alloue un arbre vide.
    	struct tree *T=malloc(sizeof(struct tree));
    	T->root=NULL;
     
    	return T;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    void insertKey(int i, struct tree *T)
    {
    	if (root==NULL) { //On crée le nouveau noeud lorsqu'on a trouvé son emplacement.
    	    root->value=i;
    	    root->lChild=NULL;
    	    root->rChild=NULL;
    	}
    	else { // On cherche l'emplacement du nouveau noeud.
            if (root->value>i) {
                root->lChild=insertkey(root->lChild,i);
            }
            else {
                root->rChild=insertkey(root->rChild,i);
            }
    	}
            //Fonction qui insere l'element i dans l'arbre T.
    }
     
     
    void inOrder(struct tree *T)
    {
        if(root->lChild!=NULL) { // On veut les noeuds dans l'ordre croissant donc on commence par les élément en bas à gauche puis on remonte vers la droite.
            inOrder(root->lChild);
        }
            printf(“ %d \n”,root->value);
        if(root->rChild!=NULL) {
            inOrder(root->rChild);
        }
    }
    //Fonction pour obtenir un parcour recursif "en-ordre" de l'arbre T.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    int main()
    {
    	struct tree *T;
    	T=constructNewTree();
     
    	insertKey(5,T);
    	insertKey(2,T);
    	insertKey(9,T);
    	insertKey(1,T);
     
    	inOrder(T);
     
    	return 0;
    }
    Voici mes erreurs:

    In function 'insertKey'
    |29|error: 'root' undeclared (first use in this function)|
    |29|error: (Each undeclared identifier is reported only once|
    |29|error: for each function it appears in.)|
    |36|warning: implicit declaration of function 'insertkey'|
    In function 'inOrder'
    |48|error: 'root' undeclared (first use in this function)|
    |51|error: stray '\223' in program|
    |51|error: expected expression before '%' token|
    |51|error: stray '\' in program|
    |51|error: stray '\224' in program|
    In function 'main'
    |70|warning: implicit declaration of function 'deleteTree'|

    Je remercie déjà tout ceux qui prendront le temps de jeter un coup d'œil à mon problème. Et j'espère que quelqu'un pourra m'aider.
    J'attends impatiemment vos réponses.

  2. #2
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Le problème est:
    void insertKey(int i, struct tree *T)
    {
    if (root==NULL) { //On crée le nouveau noeud lorsqu'on a trouvé son emplacement.
    root->value=i;
    root->lChild=NULL;
    root->rChild=NULL;
    Tu utilises "root" comme variable, alors que tu ne l'as pas declare
    Je pense que tu voulais plutot mettre:
    A la place de root

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2011
    Messages : 2
    Par défaut
    En effet, merci pour votre aide. Mais j'ai rechangé pas mal de choses en réfléchissant.

    Voici mon code actuel:

    Partie 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    struct node {
    	struct node *lChild; //Pointeur vers le fils gauche.
    	struct node *rChild; //Pointeur vers le fils droit.
    	int value; //Valeur, ou cle, du noeud.
    };
     
    struct tree {
    	struct node *root; //Pointeur vers l'element racine;
    };
     
    void insertKey(int i, struct tree *T);
    struct node * insertNode(int i, struct node *n);
     
    struct tree* constructNewTree()
    {
    	//Fonction qui alloue un arbre vide.
    	struct tree *T=malloc(sizeof(struct tree));
    	T->root=NULL;
     
    	return T;
    }
    Partie 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    void insertKey(int i, struct tree *T)
    { 
        insertNode(i, T->root);
            //Fonction qui insere l'element i dans l'arbre T.
    }
     
    struct node* insertNode(int i, struct node *n)
    {
            if (!n) {  //On crée le nouveau noeud lorsqu'on a trouvé son emplacement.
                    struct node* n=malloc(sizeof(struct node));
            	    n->value=i;
                    n->lChild=NULL;
                    n->rChild=NULL;
            }
        	else { // On cherche l'emplacement du nouveau noeud.
                if (n->value>i) {
                    n->lChild=insertNode(i,n->lChild);
                }
                else {
                    n->rChild=insertNode(i,n->rChild);
                }
            return n;
            }
    }
    Partie 3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
    	struct tree *T;
    	T=constructNewTree();
     
    	insertKey(5,T);
    	insertKey(2,T);
    	insertKey(9,T);
    	insertKey(1,T);
     
     
    	return 0;
    }
    Là je n'ai plus d'erreurs lors de la compilation.
    Mais lorsque j'utilise des printf à certains endroits, je remarque qu'en fait dans la fonction insertNode, n est toujours égal à NULL. Donc le programme crée à chaque fois le nouveau noeud/clé comme si il n'y avait pas de premier élément (racine) à mon arbre!

    En principe, il ne devrait pas y avoir d'erreurs dans les partie 1 et 3.

    Merci d'avance pour votre aide. Je ne comprends vraiment pas pq ça ne fonctionne pas comme je le voudrais.

Discussions similaires

  1. [Turbo Pascal] Implémentation d'un arbre binaire de recherche
    Par Ema1714 dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 11/05/2013, 07h59
  2. Réponses: 2
    Dernier message: 13/02/2010, 16h45
  3. Réponses: 3
    Dernier message: 31/12/2005, 12h30
  4. Réponses: 11
    Dernier message: 07/04/2004, 13h06
  5. [Arbre binaire de Recherche]
    Par Giovanny Temgoua dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 06/02/2004, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo