C ++二进制搜索树程序正在运行,但结果未显示

时间:2018-12-07 07:16:02

标签: c++

我是C ++编程的新手 在我的程序中,我正在使用二进制搜索树在程序中输入数据 当我编译程序时没有错误 但结果不显示 该语句以

结束

进程退出,返回值32212225477

按任意键继续...

我的代码在这里

#include<stdio.h> 
#include<stdlib.h>
#include<iostream> 
using namespace std;  
struct node 
{ 
    int key,empSalary;
    string empName;
    struct node *left, *right; 
}; 


struct node *newNode(int item,string name, int salary) 
{ 
    struct node *temp =  (struct node *)malloc(sizeof(struct node)); 
    temp->key = item;
    temp->empName = name;
    temp->empSalary = salary; 
    temp->left = temp->right = NULL; 
    return temp; 
} 


void inorder(struct node *root) 
{ 
    if (root != NULL) 
    { 
    inorder(root->left); 
    cout<<root->key<<"\t"<<root->empName<<"\t"<<root->empSalary;
    inorder(root->right); 
    } 
} 

struct node* insert(struct node* node, int key,string name, int salary) 
{ 
    if (node == NULL) return newNode(key,name,salary); 

    if (key < node->key) 
        node->left  = insert(node->left, key,name,salary); 
    else if (key > node->key) 
        node->right = insert(node->right, key,name,salary);    

    return node; 
} 

int main() 
{ 

    struct node *root = NULL; 

    root = insert(root, 32,"Raza",3000); 
    insert(root, 56,"Sajjad",25000); 
    insert(root, 93,"Rabia",19230); 
    insert(root, 5,"Sehar",24000); 
    insert(root, 10,"Ali",22200); 
    inorder(root); 

    return -1; 
} 

请帮助我 我认为存在运行时错误 我还设置了return 0; 但是一样。 预先感谢

2 个答案:

答案 0 :(得分:4)

一个主要问题是您使用malloc进行内存分配。那只会分配内存,而不会调用构造函数。

这意味着您的string成员empName将不会被构建,并且在您尝试使用undefined behavior时会导致thread(并且似乎崩溃了)。

如果需要在C ++中动态分配内存,则应始终使用new(并将其与delete配对)。

还有一个一般性提示:如果您曾经需要使用C样式转换(例如您对malloc的返回值进行处理),则表明您可能做错了事。

答案 1 :(得分:0)

我对您的代码做了以下事情。

  1. 用新的替换malloc 用C ++分配内存的标准方法
  2. 已使用命名空间std移除
  3. 由节点构造的大写字母将其与其他类型区分开
  4. 对所有Null指针使用C ++ nullptr
  5. 引入了一个空的根节点,该节点永远都不会被删除
    • 帮助处理边境案件
  6. 返回EXIT_SUCCESS而不是-1
  7. 不必要地删除节点类型前面的结构
  8. 节点可以按顺序为const,因为无意更改任何内容
  9. 我使用了一个初始化程序列表来用数据填充Node

修订后的代码

#include <iostream> 
#include <string>

// Use Capital letters for classes improves readability
struct Node
{
    int key{0};
    int empSalary{0};
    std::string empName;
    Node *left{nullptr}; // Initialize with default values, avoids undefined behaviour
    Node *right{nullptr};
};


// You can write simply Node* instead of struct Node
Node *newNode(int item, std::string name, int salary)
{
    // Initializer list and new
    return new Node{ item,salary,name};
}


void inorder(const Node *root) // Node is const, so make it so
{
    if (!root) return;
    inorder(root->left);
    std::cout << root->key << "\t" << root->empName << "\t" << root->empSalary << "\n";
    inorder(root->right);
}

Node* insert(Node* node, int key, std::string name, int salary)
{
    if (!node) return newNode(key, name, salary);

    if (key < node->key) {
        node->left = insert(node->left, key, name, salary);
    } else if (key > node->key) {
        node->right = insert(node->right, key, name, salary);
    }

    return node;
}

int main()
{
    Node *root = newNode(0, "ROOT", 0); // Is always there and avoids taking special care about empty trees, especially when deleting nodes

    root=insert(root, 32, "Raza", 3000);
    insert(root, 56, "Sajjad", 25000);
    insert(root, 93, "Rabia", 19230);
    insert(root, 5, "Sehar", 24000);
    insert(root, 10, "Ali", 22200);
    inorder(root->right);

    return EXIT_SUCCESS;
}