繁体   English   中英

C ++代码可以在Linux上正常运行,但不能在Windows上运行

[英]C++ code working as intended on Linux but not on Windows

我不知道为什么这段代码可能会中断,可能是在Windows上添加新节点时。返回“进程返回了-1073741819(0xC0000005)”),它是用GNU GCC编译的。在Linux上运行良好。 同样在geeksforgeeks ide上进行了测试,这是链接https://ide.geeksforgeeks.org/feo8SYMsFP 调试时,添加节点时返回SIGSEGV,但是我不确定为什么。例如,输入:1 10 1 11然后它会中断。

#include <iostream>
#include <stdlib.h>
struct Node
{
    int key;
    Node * left;
    Node * right;
};
class binarySearchTree
{
private:
    Node *root;
    Node *newNode(int key)
    {
        Node *temp = new Node;
        temp->left = temp->right = NULL;
        temp->key = key;
        return temp;
    }
    void traverse_inorder(Node *temp)
    {
        if (temp==NULL)
            return;

        traverse_inorder(temp->left);
        std::cout <<"Current key: "<< temp->key << "\n";
        traverse_inorder(temp->right);

    }
    void find(Node* temp,int key)
    {

        if (temp==NULL)
            return;
        find(temp->left,key);
        if (temp->key == key)
            std::cout <<"Key " << key << " found\n";
        find(temp->right,key);
    }
    Node* minValueNode(Node* n)
    {
        Node* x = n;
        while (x->left != NULL)
            x = x->left;
        return x;
    }
    Node* deleteNode(Node* temp, int key)
    {
        if (temp == NULL)
            return temp;
        if (key < temp->key)
            temp->left = deleteNode(temp->left, key);
        else if (key > temp->key)
            temp->right = deleteNode(temp->right, key);
        else
        {
            if (temp->left == NULL)
            {
                Node *x = temp->right;
                delete temp;
                return x;
            }
            else if (root->right == NULL)
            {
                Node *x = temp->left;
                delete temp;
                return x;
            }
            Node* x = minValueNode(temp->right);
            temp->key = x->key;
            temp->right = deleteNode(temp->right, x->key);
        }
        return temp;
    }
    void delete_tree(Node *temp)
    {
        if (temp == NULL)
            return;
        delete_tree(temp->left);
        delete_tree(temp->right);
        delete temp;

    }
    void traverse_postorder(Node* temp)
    {
        if (temp == NULL)
            return;
        traverse_postorder(temp->left);
        traverse_postorder(temp->right);
        std::cout <<"Current key: "<< temp->key << "\n";
    }
    void traverse_preorder(Node* temp)
    {
        if (temp == NULL)
            return;
        std::cout <<"Current key: "<< temp->key << "\n";
        traverse_preorder(temp->left);
        traverse_preorder(temp->right);
    }
    void add(int key)
    {
        if (root == NULL)
            root = newNode(key);
        else
        {
            Node *temp = root;
            while (true)
            {
                if (temp->key > key)
                {
                    if (temp->left == NULL)
                    {
                        temp->left = newNode(key);
                        break;
                    }
                    else
                        temp = temp->left;
                }
                else if (temp->key < key)
                {
                    if (temp->right == NULL)
                    {
                        temp->right =newNode(key);
                        break;
                    }
                    else
                        temp = temp->right;
                }
                else
                {
                    std::cout << "Key already added!\n";
                    break;
                }
            }
        }
    }
public:

    binarySearchTree()
    {
        root = NULL;
    }
    ~binarySearchTree()
    {
        delete_tree(root);
    }
    void _find(int key)
    {
        find(root,key);
    }
    void _del(int key)
    {
        root = deleteNode(root,key);
    }
    void _traverse_postorder()
    {
        traverse_postorder(root);
    }
    void _traverse_preorder()
    {
        traverse_preorder(root);
    }
    void _traverse_inorder()
    {
        traverse_inorder(root);
    }
    void _add(int key)
    {
        add(key);
    }

};
int main()
{
    binarySearchTree bst;
    std::cout << "Binary Search Tree Menu (1-add key, 2-search key, 3-remove key, 4-traverse inorder, 5-traverse postorder, 6-traverse preorder, q-exit)\n";
    char input;
    do
    {
        std::cout << "Awaiting input ";
        std::cin >> input;
        int key;

        switch(input)
        {
        case '1':
            std::cout << "Enter key.. ";
            std::cin >> key;
            bst._add(key);
            break;
        case '2':
            std::cout << "Enter key.. ";
            std::cin >> key;
            bst._find(key);
            break;
        case '3':
            std::cout << "Enter key.. ";
            std::cin>>key;
            bst._del(key);
            break;
        case '4':
            bst._traverse_inorder();
            break;
        case '5':
            bst._traverse_postorder();
            break;
        case '6':
            bst._traverse_preorder();
            break;


        }
    }
    while (input != 'q');
    std::cout << "Deleting Binary Search Tree...\n";
    return 0;
}

这段代码:

struct Node
{
    int key;
    Node * left;
    Node * right;
};

Node *newNode(int key)
{
    Node *temp = new Node;
    temp->key = key;
    return temp;
}

表示newNode返回指向节点的指针,该节点的leftright值不确定。 相反,这些应该是空指针(例如,使用new Node();而不是new Node; )。

在原始系统上,它可能恰好是从分配器中获取了零内存,因此问题没有出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM