I've been learning Data Structure and Algorithm in C and I just got a problem when chaning the order of the elements of a struct
Here is my lib.h file:
typedef struct ElementType
{
int id;
char name[20];
} ElementType;
typedef struct Node
{
ElementType data;
struct Node* left;
struct Node* right;
} Node;
Node* insert(Node** tree, ElementType e)
{
if( (*tree) == NULL )
{
(*tree)=(Node*)malloc(sizeof(Node));
(*tree)->data = e;
(*tree)->left = NULL;
(*tree)->right = NULL;
return (*tree);
}
else if ((*tree)->data.id == e.id)
return (*tree);
else if (e.id < (*tree)->data.id)
return insert( &((*tree)->left), e);
else
return insert( &((*tree)->right), e);
}
void freeTree(Node* tree)
{
if((tree) == NULL)
return;
else
{
freeTree(tree->left);
freeTree(tree->right);
free(tree);
}
}
void inorder(Node* tree)
{
if(tree!=NULL)
{
inorder(tree->left);
printf("%d - %s\n", tree->data.id, tree->data.name);
printf("This node : %p\n", tree);
printf("This data : %p\n", &(tree->data));
printf("This left : %p\n", tree->left);
printf("This right : %p\n", tree->right);
inorder(tree->right);
}
}
void init(Node** tree)
{
(*tree) = NULL;
}
Here's my main file included the above lib
ElementType makeNewElem(int a, char* b)
{
ElementType e;
e.id = a;
strcpy(e.name, b);
return e;
}
int main() {
Node* root;
init(&root);
ElementType a = makeNewElem(5, "A");
ElementType b = makeNewElem(6, "B");
ElementType c = makeNewElem(7, "C");
insert(&root, a);
insert(&root, b);
insert(&root, c);
inorder(root);
printf("\n");
freeTree(root);
inorder(root);
return 0;
}
Here's the result after I compiled
5 - A
This node : 0x1671010
This data : 0x1671010
This left : (nil)
This right : 0x1671040
6 - B
This node : 0x1671040
This data : 0x1671040
This left : (nil)
This right : 0x1671070
7 - C
This node : 0x1671070
This data : 0x1671070
This left : (nil)
This right : (nil)
23531568 -
This node : 0x1671010
This data : 0x1671010
This left : (nil)
This right : 0x1671040
23531616 -
This node : 0x1671040
This data : 0x1671040
This left : (nil)
This right : 0x1671070
0 -
This node : 0x1671070
This data : 0x1671070
This left : (nil)
This right : (nil)
Then after I move the line "ElementType data;"
typedef struct Node
{
struct Node* left;
struct Node* right;
ElementType data;
} Node;
The console >>
5 - A
This node : 0x1226010
This data : 0x1226020
This left : (nil)
This right : 0x1226040
6 - B
This node : 0x1226040
This data : 0x1226050
This left : (nil)
This right : 0x1226070
7 - C
This node : 0x1226070
This data : 0x1226080
This left : (nil)
This right : (nil)
Segmentation fault (core dumped)
Could someone help me explain why 1. Before I changed the code, why it still printed out the value of data (I though the node would be NULL after being free-ed !?) 2. After I changed the code, why I got core-dumped ?
I am so sorry for my long question and my bad English !