Я думаю, что Тайлер Хиндман прав, что это не стандартный C ++. Однако g ++, например, поддерживает это «расширение языка» C99. Это не отменяет того факта, что обычно плохая практика - размещать в стеке массивы, размер которых неизвестен во время компиляции и может быть довольно большим.
Я предполагаю, что в коде есть ошибка, которая не была предоставлена. Некоторые ошибки, связанные с проблемами памяти / указателя, могут быть замаскированы в зависимости от содержимого памяти, что может расстраивать их. В любом случае, я не вижу ошибки в прилагаемом коде. Я бы обратил внимание на то, где именно происходит сбой, и каково состояние программы в момент сбоя.
Для получения наилучшей помощи укажите минимальный (но достаточный) код для воспроизведения проблемы. Может быть, использовать pastebin, если он кажется слишком большим?
// РЕДАКТИРОВАТЬ // ОК. Я посмотрел ваш полный список кодов.
См. исправленный код . Основные отличия:
1) У вас есть ошибка в коде, которая очищает дерево. Здесь не следует вызывать Tree :: del (), потому что он предназначен для удаления определенного значения. Он должен найти узел, который нужно удалить, а затем разобраться с различными особыми случаями. Когда вы стираете содержимое дерева, вы можете просто рекурсивно удалить все узлы. Легко и быстро!
2) Я объединил ваши две функции поиска в одну.
3) В Tree :: del произошла ошибка для случая, когда удаляемый узел является корневым. При удалении корневого узла родитель будет иметь значение NULL ...
4) Логика чтения чисел с входа изменена.
Надеюсь, вы изучите код и узнаете, что изменилось и почему. Также не забудьте точно определить, где происходит сбой вашего кода, и получить как можно больше информации о сбое, вместо того чтобы просто сказать «о черт, он разбился!».
С наилучшими пожеланиями:)