[C] Suppression arbre binaire

Suppression arbre binaire [C] - C++ - Programmation

Marsh Posté le 20-04-2002 à 15:41:43    

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
Reply

Marsh Posté le 20-04-2002 à 15:41:43   

Reply

Marsh Posté le 20-04-2002 à 16:07:01    

L'erreur doit être ailleurs.

Reply

Marsh Posté le 22-04-2002 à 14:47:19    

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
Reply

Marsh Posté le 22-04-2002 à 16:29:19    

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 ?

Reply

Marsh Posté le 22-04-2002 à 16:34:24    

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
Reply

Marsh Posté le 22-04-2002 à 17:44:33    

[ 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]

Reply

Marsh Posté le 22-04-2002 à 17:52:41    

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
Reply

Marsh Posté le 22-04-2002 à 18:02:23    

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
Reply

Marsh Posté le 22-04-2002 à 18:02:59    

[ 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;
}

Reply

Marsh Posté le 22-04-2002 à 18:08:02    

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
Reply

Marsh Posté le 22-04-2002 à 18:08:02   

Reply

Marsh Posté le 22-04-2002 à 18:11:10    

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 !
Reply

Marsh Posté le 22-04-2002 à 18:21:46    

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


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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed