Code complet http://pastebin.com/6bdVTyPt Mon code d’arborescence fonctionnait parfaitement jusqu’à ce que je découvre que je devais valider l’id qu’il n’était pas du texte et qu’il devait donc s’agir d’une fonction d’insertion de chaîne. (atoi) et comparer sous forme de nombres entiers ne fonctionne pas, aide appréciée
merci heres la fonction d’insertion utilisant atoi au lieu de strcomp http://pastebin.com/yeuktyAF La fonction d’insertion ne fonctionne toujours pas
struct node * insert2(struct node *root, char x[],char id[]) { if(!root) { root=(struct node*)malloc(sizeof(struct node)); free( root->data ); free( root->id );// free previously allocated memory, if any root->data = strdup( x ); // malloc and copy root->id=strdup(id); root->left = NULL; root->right = NULL; // printf("1\n"); return(root); } printf("ssortingng comp %d of %s of %s\n",strcmp(root->id,id),root->id,id); if((strcmp(root->id,id))>0){ root->left = insert(root->left,x,id); printf("go left\n"); } else { if(strcmp(root->id,id)right = insert(root->right,x,id);} } return(root); }
La ligne
root=(struct node*)malloc(sizeof(struct node));
alloue de la mémoire pour root
mais ne l’initialise pas. Cela signifie que les lignes suivantes
free( root->data ); free( root->id );
essayez de libérer des pointeurs non initialisés (donc imprévisibles). Cela va presque certainement planter.
Comme vous venez juste d’allouer la root
il ne peut pas y avoir de valeur précédente dans data
ou id
à libérer. Cela signifie que vous pouvez simplifier ces trois lignes pour
root=malloc(sizeof(*root));
Vous ne pouvez pas comparer les chaînes numériques à l’aide de strcmp()
. Vous devriez stocker vos ID: s sous forme d’entiers, si c’est ce qu’ils sont, afin de pouvoir les comparer directement.
Cela présente également l’avantage d’être moins complexe, puisque les entiers ont une taille fixe (en supposant que la unsigned long
soit suffisamment longue), vous n’aurez pas besoin d’utiliser strdup()
.
De même, ne convertissez pas la valeur de retour de malloc()
en C.