2013-12-03 5 views
0

Я построил BST, который содержит названия альбомов и годы, и он построен в соответствии с годами. Но я хочу ввести названия альбомов, и это должно дать год. Так что я построил этот код часть:Найти String в BST

int FindString(treeAlbum *node,char albumTitle[]) 
{ 

    FindString(node->Left,albumTitle); 
    FindString(node->Right,albumTitle); 
    if(!strcpy(node->albumTitle, albumTitle)) 
    { 
     return node->year; 
    } 
} 

И treeAlbum структура

struct treeAlbum{ 
     char albumTitle[100]; 
     int year; 
     struct treeAlbum *Left; 
     struct treeAlbum *Right; 
} 

Наконец, этот код выдаст ошибку (Сегментация Fault). Как я могу это исправить ? Спасибо.

+0

Нам нужна дополнительная информация, чтобы узнать, в чем проблема. Сначала попробуйте загрузить его в gdb и получить номер строки, где проблема находится в вашем коде. –

+0

@JesusRamos Я могу отлаживать свой код. Другая часть кода правильно работает. В этой части есть ошибка. – Semih

+0

Вот что такое отладка ... найти ошибки и исправить их. Ясно, что вы не можете отлаживать свой код, если не хотите, чтобы вы не задавали этот вопрос. –

ответ

1

Мое лучшее предположение о неисправности сегментации заключается в том, что вы не проверяете свой базовый корпус.

int FindString(treeAlbum *node,char albumTitle[]) 
{ 
    if (!node) 
    { 
     // Return something sane here 
     return ERROR_NOT_FOUND; 
    } 

    FindString(node->Left,albumTitle); 
    FindString(node->Right,albumTitle); 
    if(!strcpy(node->albumTitle, albumTitle)) 
    { 
     return node->year; 
    } 
} 

Однако, код имеет некоторые другие вопросы:

  1. Что вы делаете с возвращаемые значения из рекурсивных вызовов в FindString. Сейчас ты ничего не делаешь.
  2. Вы используете strcpy, но, возможно, вы имеете в виду strcmp.
  3. У вас есть двоичное дерево поиска, но вы выполняете поиск после исправления. Это линейно по размеру вашего дерева, но вы должны иметь возможность использовать сортировку BST для получения бинарного дерева log (n). А именно, посмотрите на альбом в текущем узле и посмотрите, все ли вы сделали, нужно искать влево или искать.
+0

@ Micheal Я стараюсь делать то, что вы говорите. Но мой код стилирует ошибку сегментации. На ваш взгляд, что такое рациональный код, который делает то, что я хочу? – Semih

+0

Я не уверен, потому что не знаю, как выглядит ваш код сейчас. Проверьте свои указатели на указатели, чтобы убедиться, что вы не можете достичь кода, не указав при этом, что указатель действителен. – Michael

0

Первое, что вы делаете в FindString это вызов FindString снова node->Left. Либо node->Left в конечном итоге составляет null (если ваше дерево правильно построено), что вызовет segfault или это более ранний узел в дереве (в этом случае ваша рекурсия заставит стек заполнить). Проверка нулевого случая обязательно необходима!

0

Вы хотите использовать strcmp, а не strcpy. Вы должны оценить результат двух вызовов FindString() и продолжить работу, только когда они не удались.

Смежные вопросы