treeNode *newNode(char * s)
{
treeNode *insert = (treeNode*)malloc(100*sizeof(treeNode));
insert->left = NULL;
insert->right = NULL;
insert->word = s;
return insert;
}
Используйте malloc(sizeof(treeNode))
для выделения одного узла. Не умножайте на 100, если вам не нужна память для 100 узлов.
Не просто присваивайте указатели буквенным строкам (insert->word = s
). Вместо этого выделите память для этой строки и используйте strcpy
. Пример:
insert->word = malloc(strlen(str) + 1);
strcpy(insert->word, str);
Если цель состоит в том, чтобы вставить отсортированные элементы, то вам придется пройтись по всем элементам. Я рекомендую избегать рекурсивных функций, особенно для начинающих.
Наконец, скомпилируйте вашу программу с максимальным количеством предупреждений. Обращайтесь ко всем предупреждениям.
typedef struct node {
char * word;
struct node * left;
struct node * right;
}treeNode;
void traverse(treeNode *head)
{
treeNode *ptr = head;
while(ptr)
{
printf("%s, ", ptr->word);
ptr = ptr->right;
}
printf("\n");
}
treeNode *insert(treeNode *head, char *str)
{
treeNode *ptr = malloc(sizeof(treeNode));
ptr->left = NULL;
ptr->right = NULL;
ptr->word = malloc(strlen(str) + 1);
strcpy(ptr->word, str);
if(head == NULL)
{
head = ptr;
return head;
}
else
{
int inserted = 0;
treeNode *walk = head;
treeNode *prev = NULL;
while(walk)
{
if(strcmp(ptr->word, walk->word) < 0)
{
if(walk == head)
{
ptr->right = head;
head = ptr;
}
else
{
prev->right = ptr;
ptr->right = walk;
}
inserted = 1;
break;
}
prev = walk;
walk = walk->right;
}
if(!inserted)
{
prev->right = ptr;
}
}
return NULL;
}
int main(void)
{
treeNode *head = NULL;
printf("\nTest Animals 1");
head = insert(head, "dog");
insert(head, "horse");
insert(head, "frog");
insert(head, "fish");
insert(head, "cow");
traverse(head);
return 0;
}
Если это дерево двоичного поиска, следуйте приведенному ниже коду:
void traverse(treeNode *head)
{
if(head)
{
traverse(head->left);
printf("%s \n", head->word);
traverse(head->right);
}
}
treeNode *insert(treeNode *head, char * s)
{
if(head == NULL)
{
treeNode *ptr = malloc(sizeof(treeNode));
ptr->left = NULL;
ptr->right = NULL;
ptr->word = malloc(strlen(s) + 1);
strcpy(ptr->word, s);
return ptr;
}
if(strcmp(head->word, s) > 0)
head->left = insert(head->left, s);
else
head->right = insert(head->right, s);
return head;
}
void main(void)
{
treeNode *head = NULL;
head = insert(NULL, "dog");
insert(head, "horse");
insert(head, "frog");
insert(head, "fish");
insert(head, "cow");
traverse(head);
return 0;
}