首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >莫尔斯码二叉树中的故障分割

莫尔斯码二叉树中的故障分割
EN

Stack Overflow用户
提问于 2017-07-29 07:54:53
回答 1查看 841关注 0票数 0

在这个程序中,创建了一个二进制搜索树,其中包含一个字母和2个TREENODE指针(左和右)组成的TREENODE结构,以连接到其他节点并模拟树。

将用户输入保存到字符数组text中。编码函数通过数组进行迭代,完成morse代码的转换,并将其保存到字符数组morse中。就像一种魅力。

问题:接收Decode函数中的分段错误。全球开发银行:

这表示没有真正创建二进制搜索树。

我如何修正这段代码,以便解码函数能够工作?(我知道我只需要cout text,但是我想创建一个合法的函数来解码一个字符数组。

头文件:

代码语言:javascript
复制
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;
            }
        }
    }
}

main():

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

发布于 2017-07-29 08:02:19

Decode中,无论何时开始解码新的morse代码符号,都需要添加node = root;。可以这样做:

代码语言:javascript
复制
for (morsePtr = morse; *morsePtr; ++morsePtr) {
    if (*morsePtr != ' ') {
        // ...
    } else {
        node = root;
    }
}

您还应该检查要访问的节点(例如。如果您的输入无效,则实际存在node->left)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45386858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档