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 etrange dans l'implémentation des arbres binaires


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Par défaut erreur etrange dans l'implémentation des arbres binaires
    Bonjour, j'implémente les arbres binaires en c sous eclipse avec MinGW, et je me retrouve confronté à une erreur étrange.
    Je suis sûr qu'il n'y a pas d'erreur de programmation parce que dans le debug au pas a pas tout ce passe comme il faut pourtant en exécution normale le programme plante avec ce message ArbreBinaire.exe a cessé de fonctionner
    voici le code :

    ArbreBinaire.h
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #ifndef __AB__
    #define __AB__
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct MNoeud
    {
    	int val;
    	struct MNoeud *fg;
    	struct MNoeud *fd;
    } Noeud;
     
    /**
     * @param val
     * @param fg : fils gauche
     * @param fd : fils droit
     * @return Noeud*
     */
    Noeud* construireNoeud(int val, Noeud *fg, Noeud *fd);
     
    typedef struct MArbreBinaire
    {
    	Noeud *racine;
    	int nbelt;
    } ArbreBinaire;
     
    /**
     * @return AbreBinaire*
     */
    ArbreBinaire* construireAB();
     
    /**
     * @param a
     * @param val
     */
    void inserer(ArbreBinaire **a, int val);
     
    /**
     * @return a
     */
    void afficher(Noeud *a);
     
    #endif
    ArbreBinaire.c
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include "ArbreBinaire.h" 
     
    Noeud* construireNoeud(int val, Noeud *fg, Noeud *fd)
    {
    	Noeud *n = (Noeud*)malloc(sizeof(Noeud*));
     
    	n->val = val;
    	n->fg = fg;
    	n->fd = fd;
     
    	return n;
    }
     
    ArbreBinaire* construireAB()
    {
    	ArbreBinaire *ab = (ArbreBinaire*)malloc(sizeof(ArbreBinaire*));
    	ab->racine = NULL;
    	ab->nbelt = 0;
     
    	return ab;
    }
     
    void inserer(ArbreBinaire **a, int val)
    {
    	Noeud *y = (*a)->racine;
    	Noeud *feuille = NULL;
    	Noeud *nn = construireNoeud(val, NULL, NULL);
     
    	while(y != NULL)
    	{
    		feuille = y;
    		if (val < y->val)
    			y = y->fg;
    		else
    			y = y->fd;
    	};
     
    	if (feuille == NULL)
    		(*a)->racine = nn;
    	else
    	{
    		if (nn->val < feuille->val)
    			feuille->fg = nn;
    		else
    			feuille->fd = nn;
    	}
     
    	(*a)->nbelt++;
    }
     
    void afficher(Noeud *a)
    {
    	if (a != NULL)
    	{
    		afficher(a->fg);
    		printf("%d ", a->val);
    		afficher(a->fd);
    	}
    }
    main.c
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "ArbreBinaire.h"
     
    int main()
    {
    	ArbreBinaire *ab = construireAB();
     
    	inserer(&ab, 5);
    	inserer(&ab, 2);
     
    	inserer(&ab, 15);
     
    	afficher(ab->racine);
    	puts("");
    	return EXIT_SUCCESS;
    }

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut.

    1) Tes deux malloc réservent une zone mémoire de la taille d'un pointeur et non de la taille de la structure. Le crash est ici inévitable.

    2) Il faut toujours tester le retour d'un malloc. C'est sinon un bug, pouvant générer un crash (même si ça a très peu de chance d'arriver).

    3) C'est en principe au programme de désallouer la mémoire allouée (même si l'OS s'en charge). Il n'y a aucun free dans le programme.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Par défaut
    je m'en veux pour cette erreur débile merci beaucoup de votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Complexité des arbres binaires de recherche
    Par mannour85 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 15/12/2014, 12h13
  2. Erreur XP dans la gestion des utilisateurs
    Par aladin95 dans le forum Windows XP
    Réponses: 2
    Dernier message: 16/02/2013, 17h43
  3. [AC-2007] Erreur etrange dans procedure evenementielle
    Par r2d2c6po dans le forum VBA Access
    Réponses: 1
    Dernier message: 21/01/2012, 09h10
  4. Erreur implémentation d'arbre binaire de recherche.
    Par Pallas. dans le forum Débuter
    Réponses: 2
    Dernier message: 24/03/2011, 19h27
  5. récupérer les erreurs php dans des exceptions
    Par jeanvincent dans le forum Langage
    Réponses: 6
    Dernier message: 14/10/2005, 16h26

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