我是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; 但是一样。 预先感谢
答案 0 :(得分:4)
一个主要问题是您使用malloc
进行内存分配。那只会分配内存,而不会调用构造函数。
这意味着您的string
成员empName
将不会被构建,并且在您尝试使用undefined behavior时会导致thread(并且似乎崩溃了)。
如果需要在C ++中动态分配内存,则应始终使用new
(并将其与delete
配对)。
还有一个一般性提示:如果您曾经需要使用C样式转换(例如您对malloc
的返回值进行处理),则表明您可能做错了事。
答案 1 :(得分:0)
我对您的代码做了以下事情。
修订后的代码
#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;
}