Suppression arbre binaire [C] - C++ - Programmation
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  
 
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 ? 
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. 
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]
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 ? 
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 :
  | 
 
 
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]
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; 
} 
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))
 
 
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. 
Marsh Posté le 22-04-2002 à 18:21:46
effectivement ça plante pu maintenant, merci bien !  
 
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