Первоначальной проблемой было почти наверняка то, что start
было NULL
, поскольку вы не обновляли его при обновлении root
.(Между тем, кажется, что все start
не нужно; просто используйте root
напрямую.)
Новая проблема (печать только последнего слова) состоит в том, что вы неправильно обходите дерево: ваш print
Функция печатает, только если left
и right
равны NULL
, поэтому печатается только листовой узел, и, кроме того, он не спускается в ветвь right
, если есть ветвь left
.
Вместо этого вы можете попробовать что-то вроде этого (непроверенный код):
void print(struct node * a) {
if (a == NULL) { return; }
print(a->left);
(void) puts(a->item);
print(a->right);
}
В частности, обратите внимание, что если вы находитесь не на узле NULL
, вам необходимо напечатать его item
безусловно, или весь вывод будет отсутствовать в этом узле.
Другая проблема , по-видимому, в том, что вы не копируете item
при создании узла.Поэтому, если ваш temp
в insert(root, temp)
действительно является временным объектом, который будет перезаписан или освобожден, все ваши item
с (за исключением, возможно, последнего) будут недействительными к тому времени, когда вы попытаетесь их напечатать.Вместо присвоения new->item = a
, сделайте эквивалент new->item = strdup(a)
и затем запомните free
при освобождении узла.
(strdup
отсутствует в стандартной библиотеке C, но это легкореализовать: выделить достаточно места для строки, включая терминатор NUL, и скопировать.)
Кроме того, сравнение b <= a->item
почти наверняка не дает ожидаемого результата;см strcmp
.