Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2750 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C] Suppression arbre binaire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Suppression arbre binaire

n°128862
[ ZeD ]
Désigné volontaire
Posté le 20-04-2002 à 15:41:43  profilanswer
 

Hello,
 
Voilà j'ai un arbre binaire tout con, mais j'arrive pas à le supprimer pour libérer la mémoire  :(
 
j'avais pensé à une fonction dans ce genre mais g une erreur windows avec :
 
void SupprimeArbre(NOEUD* n)
{
  if (n != NULL)
 {
  SupprimeArbre(n->gauche);
  SupprimeArbre(n->droite);
  free(n);  
 }
}


---------------
The N·Zone New Formation Official Website
mood
Publicité
Posté le 20-04-2002 à 15:41:43  profilanswer
 

n°128865
verdoux
And I'm still waiting
Posté le 20-04-2002 à 16:07:01  profilanswer
 

L'erreur doit être ailleurs.

n°129328
[ ZeD ]
Désigné volontaire
Posté le 22-04-2002 à 14:47:19  profilanswer
 

bah groumf... voilà les structures que j'utilise :
 
typedef struct _LIVRE
 {
  char* titre;
  char* auteur;
  short nbpages;
  char ISBN[15];
  char emprunt[30];
  time_t date;
 } LIVRE;
 
 
typedef struct _NOEUD
{
 LIVRE media;
 struct _NOEUD *droite;
 struct _NOEUD *gauche;
} NOEUD;
 
Alors  :??:


---------------
The N·Zone New Formation Official Website
n°129385
kenshiro18​2
Posté le 22-04-2002 à 16:29:19  profilanswer
 

Deja, ou sont stockes "auteur" et "titre" ?
 
Lance ton programme en debug, et tu verras bien ou il se crashe.
Tu es sur que tu detruis par deux fois un arbre ?

n°129390
[ ZeD ]
Désigné volontaire
Posté le 22-04-2002 à 16:34:24  profilanswer
 

bah j'initialise un noeud comme ça :
 
 NOEUD* Noeud;
 
 Noeud = (NOEUD*)malloc(sizeof(NOEUD));
 Noeud->media.titre = (char*)malloc(sizeof(char));
 Noeud->media.auteur = (char*)malloc(sizeof(char));
 Noeud->droite = NULL;
 Noeud->gauche = NULL;
 
et la fonction de suppression crashe au premier free() qu'elle doit effectuer.


---------------
The N·Zone New Formation Official Website
n°129454
zi_ril_wan​ou
Posté le 22-04-2002 à 17:44:33  profilanswer
 

[ ZeD ] a écrit a écrit :

bah j'initialise un noeud comme ça :
 
 NOEUD* Noeud;
 
 Noeud = (NOEUD*)malloc(sizeof(NOEUD));
 Noeud->media.titre = (char*)malloc(sizeof(char));
 Noeud->media.auteur = (char*)malloc(sizeof(char));
 Noeud->droite = NULL;
 Noeud->gauche = NULL;
 
et la fonction de suppression crashe au premier free() qu'elle doit effectuer.  




 
Ca fait des chaines de 1 caractère allouées pour titre et auteur ça... si tu écris dans titre et auteur autre chose qu'un seul caractère, ça plante irrémédiablement à la libération de l'espace alloué au pointeur...  
Fait "man malloc", tu verras que tu utilises mal cette fonction.

 

[jfdsdjhfuetppo]--Message édité par zi_ril_wanou le 22-04-2002 à 17:45:15--[/jfdsdjhfuetppo]

n°129460
[ ZeD ]
Désigné volontaire
Posté le 22-04-2002 à 17:52:41  profilanswer
 

conclusion ça sert à rien d'utiliser un char* pour une chaine de caractères c ça ?
 
autant que je mette un char titre[50] si g bien compris ?


---------------
The N·Zone New Formation Official Website
n°129463
HelloWorld
Salut tout le monde!
Posté le 22-04-2002 à 18:02:23  profilanswer
 

Pour faire simple oui
mais si tu depasses rarement 10 caracteres, ca fait a force une place non negligeable de perdue ...
le mieux est d'allouer au moment de l'affectation
au moment où tu dois copier titre et auteur, tu alloue ainsi :

Code :
  1. /* soient Titre et Auteur a copier */
  2.     Noeud->media.titre = (char*)malloc(strlen(Titre) + 1);
  3.     Noeud->media.auteur = (char*)malloc(strlen(Auteur) + 1);


 
et si tu dois les modifier, tu peux faire des realloc a la place des malloc (si media.titre vaut NULL, realloc fonctionne comme malloc)
n'oublie pas d'initialiser a NULL ces 2 champs quand tu initialises ton noeud (si ce n'est pas à ce moment que tu copies les chaines)

 

[jfdsdjhfuetppo]--Message édité par HelloWorld le 22-04-2002 à 18:03:53--[/jfdsdjhfuetppo]


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°129464
zi_ril_wan​ou
Posté le 22-04-2002 à 18:02:59  profilanswer
 

[ ZeD ] a écrit a écrit :

conclusion ça sert à rien d'utiliser un char* pour une chaine de caractères c ça ?
 
autant que je mette un char titre[50] si g bien compris ?  




Si tu ne sais pas bien gérer ta mémoire oui.
Sinon, rien ne t'empèche de faire des fonctions NewTaStructure() et FreeTaStructure(TaStructure *ptStruct) qui font respectivement :
TaStructure *NewTaStructure() {
  TaStructure *ptStruct;
  ptStruct = (TaStructure *)calloc(1,sizeof(TaStructure));
  ptStruct->TaChaine = (char *)malloc(50); // 50 ou la taille que tu veux.
  return ptStruct;  
}
TaStructure *FreeTaStructure(TaStructure *ptStruct) {
  if (ptStruct) { // sous entendu ptStruct != NULL
    if (ptStruct->TaChaine) {
       free(ptStruct->TaChaine);
    }
    free(ptStruct);
  }
  return NULL;
}

n°129469
HelloWorld
Salut tout le monde!
Posté le 22-04-2002 à 18:08:02  profilanswer
 

Je comprend pas trop l'avantage d'allouer des chaines de taille fixes a la place de faire comme il dit (inclure directement char titre[50] dans la structure et se limiter a un Noeud = (NOEUD*)malloc(sizeof(NOEUD));) :??:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 22-04-2002 à 18:08:02  profilanswer
 

n°129470
zi_ril_wan​ou
Posté le 22-04-2002 à 18:11:10  profilanswer
 

HelloWorld a écrit a écrit :

Je comprend pas trop l'avantage d'allouer des chaines de taille fixes a la place de faire comme il dit (inclure directement char titre[50] dans la structure et se limiter a un Noeud = (NOEUD*)malloc(sizeof(NOEUD));) :??:  




Dans son cas, il n'y en a pas.(10 ou 50 on s'en fout)
Par contre, dès lors que tu ne connais pas à priori la taille de la chaîne ou de l'objet à créer... (10 ou 1 000 000 octets) bah là ça change tout.


---------------
Get the Cooool... Get the cool shoe-shine !
n°129476
[ ZeD ]
Désigné volontaire
Posté le 22-04-2002 à 18:21:46  profilanswer
 

effectivement ça plante pu maintenant, merci bien !  :hello:


---------------
The N·Zone New Formation Official Website

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C] Suppression arbre binaire

 

Sujets relatifs
[Algo] Equilibrer un arbre binaire...OUVERTURE fenetre windows pour confirmation suppression...
java : ecrire en binairebinaire
[URGENT] [C++] .cpp transformé en binaire ...[C++] Manipulation de fichier binaire (help)
[JAVA] Arbre de jeuGenerateur d'arbre en fractale
conversion nombre binaire-->nombre decimal ??? 
Plus de sujets relatifs à : [C] Suppression arbre binaire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR