首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二叉树代码在Linux上工作,但在Windows 10上不起作用

二叉树代码在Linux上工作,但在Windows 10上不起作用
EN

Stack Overflow用户
提问于 2021-05-10 20:24:45
回答 1查看 89关注 0票数 2

我在Linux上运行的代码没有内存错误,在Linux上运行时树的构建是正确的,但是当我在Windows上运行它时,它就会卡住并终止。

代码语言:javascript
复制
struct node {
    char letter;
    char *string;
    int last_node;
    struct node *left;
    struct node *right;
};

static struct node nodes[] =
{
    {'\0', ""},
    {'E', "."},
    {'T', "-"},
    {'I', ".."},
    {'A', ".-"},
    {'N', "-."},
    {'M', "--"},
    {'S', "..."},
    {'U', "..-"},
    {'R', ".-."},
    {'W', ".--"},
    {'D', "-.."},
    {'K', "-.-"},
    {'G', "--."},
    {'O', "---"},
    {'H', "...."},
    {'V', "...-"},
    {'F', "..-."},
    {'\0', "..--"},
    {'L', ".-.."},
    {'\0', ".-..-"},
    {'P', ".--."},
    {'J', ".---"},
    {'B', "-..."},
    {'X', "-..-"},
    {'C', "-.-."},
    {'Y', "-.--"},
    {'Z', "--.."},
    {'Q', "--.-"},
    {'\0', "---."},
    {'\0', "----"},
    {'5', "....."},
    {'4', "....-"},
    {'\0', "...-."},
    {'3', "...--"},
    {'\0', "..-.."},
    {'\0', "..-.-"},
    {'\0', "..--."},
    {'2', "..---"},
    {'\0', ".-..."},
    {'\0', ".-..-"},
    {'\0', ".-.-."},
    {'\0', ".-.--"},
    {'\0', ".--.."},
    {'\0', ".--.-"},
    {'\0', ".---."},
    {'1', ".----"},
    {'6', "-...."},
    {'\0', "-...-"},
    {'/', "-..-."},
    {'\0', "-..--"},
    {'\0', "-.-.."},
    {'\0', "-.-.-"},
    {'\0', "-.--."},
    {'\0', "-.---"},
    {'7', "--..."},
    {'\0', "--..-"},
    {'\0', "--.-."},
    {'\0', "--.--"},
    {'8', "---.."},
    {'\0', "---.-"},
    {'9', "----."},
    {'0', "-----"},
    {.last_node = 1}
};

struct node *
tree_insert(struct node *root, struct node *selnode_addr, char *string)
{
    if (string[0] == '.')
    {
        if (string[1] == 0)
        {
            return root -> left = selnode_addr;
        }
        return tree_insert(root -> left, selnode_addr, string + 1);
    }

    if (string[1] == 0)
    {
        return root -> right = selnode_addr;
    }
    return tree_insert(root -> right, selnode_addr, string + 1);
}

int
main(void)
{
    // constructs the binary tree.
    for (struct node *nodeptr = nodes + 1; !nodeptr -> last_node; nodeptr++)
    {
        tree_insert(nodes, nodeptr, nodeptr -> string);
    }

    puts("test");
    return 0;
}

在Linux上,它运行并打印“test”,并且没有内存错误,并且通过了英勇测试。我在GDB中验证了树的构建是正确的,但是在Windows上它挂了很短的时间,然后似乎崩溃了。我不知道为什么。

更新

  • 编译器是gcc (MinGW.org GCC Build-2) 9.2.0
  • I尝试了-std=c99 -pedantic,但也没有工作,
  • Braden Best建议删除树底部的空节点,然后开始工作。下面提供了新的工作树.

新数组:

代码语言:javascript
复制
static struct node nodes[] =
{
    {'\0', ""},
    {'E', "."},
    {'T', "-"},
    {'I', ".."},
    {'A', ".-"},
    {'N', "-."},
    {'M', "--"},
    {'S', "..."},
    {'U', "..-"},
    {'R', ".-."},
    {'W', ".--"},
    {'D', "-.."},
    {'K', "-.-"},
    {'G', "--."},
    {'O', "---"},
    {'H', "...."},
    {'V', "...-"},
    {'F', "..-."},
    {'\0', "..--"},
    {'L', ".-.."},
    {'P', ".--."},
    {'J', ".---"},
    {'B', "-..."},
    {'X', "-..-"},
    {'C', "-.-."},
    {'Y', "-.--"},
    {'Z', "--.."},
    {'Q', "--.-"},
    {'\0', "---."},
    {'\0', "----"},
    {'5', "....."},
    {'4', "....-"},
    {'3', "...--"},
    {'2', "..---"},
    {'1', ".----"},
    {'6', "-...."},
    {'/', "-..-."},
    {'7', "--..."},
    {'8', "---.."},
    {'9', "----."},
    {'0', "-----"},
    {.last_node = 1}
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-10 23:10:32

当向树插入字符串时,代码假定该字符串的每个前缀都已插入。这主要是因为字符串是按长度排序的。

但是,字符串.-.-..-.--被插入到树中,而它们的前缀.-.-从未被插入。这将导致使用tree_insertroot == NULL进行递归调用。我很惊讶这不会像我一样在Linux上崩溃。

在您的固定代码中,您删除了.-.-..-.--字符串,使其正常工作。

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

https://stackoverflow.com/questions/67477252

复制
相关文章

相似问题

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