Ошибка сегментации в дереве двоичного поиска азбуки Морзе

По сути, в этой программе создается двоичное дерево поиска, полное TREENODE структуры, состоящие из буквы AMD 2 TREENODE указатели (левый и правый) для подключения к другим узлам и имитации дерева.

Пользовательский ввод сохраняется в массив символов text, Функция Encode выполняет итерацию по массиву и вызывает преобразование кода Морзе, которое сохраняется в массиве символов. morse, Работает как шарм.

проблема: Получить ошибку сегментации в Decode функция. GDB: ! [Ошибка сегментации BST

Это указывает на то, что двоичное дерево поиска на самом деле не было создано.

Как я могу исправить этот код так, чтобы функция декодирования работала? (Я понимаю, что я могу просто cout text но я хотел бы создать легитимную функцию, которая декодирует массив символов.

Заголовочный файл:

struct TREENODE {
char letter;
TREENODE *left;
TREENODE *right;

TREENODE(){ // Constructor
letter = '*'; //To be replaced by a letter later.
left = 0;
right = 0;
}
};

struct MORSECODE{ //each morsecode object has
char letter; //English letters.
char code[20]; //Dots + dashes
};

class TELEGRAPH{ //The binary (tree)
private:
static MORSECODE table[40];
static TREENODE * root;
static void destroyTree(TREENODE *node);
public:
TELEGRAPH(){
root = NULL;
}
static void buildTree();
static void destroyTree();
void Encode(char text[], char morse[]);
void Decode(char morse[], char text[]);
};

MORSECODE TELEGRAPH::table[40] = {
{'A', ".-"}, {'B', "-..."}, {'C', "-.-."}, {'D', "-.."},
{'E', "."}, {'F', "..-."}, {'G', "--."}, {'H', "...."},
{'I', ".."}, {'J', ".---"}, {'K', "-.-"}, {'L', ".-.."},
{'M', "--"}, {'N', "-."}, {'O', "---"}, {'P', ".--."},
{'Q', "--.-"}, {'R', ".-."}, {'S', "..."}, {'T', "-"},
{'U', "..-"}, {'V', "...-"}, {'W', ".--"}, {'X', "-..-"},
{'Y', "-.--"}, {'Z', "--.."},
{'0', "-----"}, {'1', ".----"}, {'2', "..---"}, {'3', "...--"},
{'4', "....-"}, {'5', "....."}, {'6', "-...."}, {'7', "--..."},
{'8', "---.."}, {'9', "----."},
{'.', ".-.-.-"}, {',', "--..--"}, {'?', "..--.."},
{'\0', "END"}
};
TREENODE* TELEGRAPH::root = 0;

void TELEGRAPH::Decode(char morse[], char text[]){
char *morsePtr;
TREENODE *node;
node = root;
cout << "Decode called."  << endl;
for (morsePtr = morse; *morsePtr; morsePtr++) {
if(*morsePtr != ' '){
if(*morsePtr == '.'){
node = node->left;
}
else if (*morsePtr == '-'){
node = node->right;
}
}
continue;
}
*text++ = node->letter;
return;
}

void TELEGRAPH::Encode(char text[], char morse[]){
int i;
char c, *t, *morsePtr;
cout << "Encode called" << endl;
cout << "\nSending >>> ";
for (t = text; *t; t++){
c = toupper(*t);
if (c == ' ') {
*morse++ = ' ';
continue;
}

for (i = 0; table[i].letter; i++){
if (table[i].letter == c) break;
}
if (!table[i].letter){
continue;
}
morsePtr = table[i].code;
while (*morsePtr){
*morse++ = *morsePtr++;
}
*morse++ = ' ';
}
}

void TELEGRAPH::buildTree(){
TREENODE *node, *nextNode;
char *morsePtr; //Points to the dots and dashes in the table.
root = new TREENODE;
if (!root){
return;
}
root->letter = ' ';
cout << "Alphabet in Morse:";
for (int i = 0; table[i].letter; i++) {
node = root;
for (morsePtr = table[i].code; *morsePtr; morsePtr++){ //goes through the morse code for that letter/symbol.
if(*morsePtr ==  '-'){
cout << *morsePtr;
nextNode = new TREENODE;
node->right = nextNode;
node = node->right;
}
else if(*morsePtr == '.'){
cout << *morsePtr;
nextNode = new TREENODE;
node->left = nextNode;
node = node->left;
}
}
}
}

главный():

int main(){
TELEGRAPH station;
char text[80], morse[600];
station.buildTree();
cout << "\nEnter telegram (in English): ";
cin.getline(text, 80);
station.Encode(text, morse);
cout << morse;
cout << " >>> Received\n\n";
station.Decode(morse, text);
cout << "Message sent: " << text << endl;
station.destroyTree();
}

0

Решение

В Decodeнужно добавить node = root; всякий раз, когда вы начинаете декодировать новый символ азбуки Морзе. Это можно сделать следующим образом:

for (morsePtr = morse; *morsePtr; ++morsePtr) {
if (*morsePtr != ' ') {
// ...
} else {
node = root;
}
}

Вы также должны проверить, что узел, к которому вы хотите получить доступ (например, node->left) на самом деле существует, если ваш ввод неверен.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]