gpt4 book ai didi

c++ - 通过引用传递指针(插入二叉搜索树)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:18 27 4
gpt4 key购买 nike

我的程序正在调用一个成员函数,该函数使用通过引用传递的指针向二叉搜索树执行插入操作(以便更改指针的值)。但是,当我尝试将第二个节点插入到树中时,程序崩溃了。我假设这与错误的指针有关。

此赋值中唯一可以更改的部分是成员函数的实现,而不是声明。

如有任何帮助,我们将不胜感激。

 //Header file
using namespace std;

struct PersonRec
{
char name[20];
int bribe;
PersonRec* leftLink;
PersonRec* rightLink;
};


class CTree
{

private:
PersonRec *tree;
bool IsEmpty();
void AddItem( PersonRec*&, PersonRec*);
void DisplayTree(PersonRec*);

public:
CTree();
//~CTree();
void Add();
void View();

};

//Implementation file

#include <iostream>
#include <string>

using namespace std;

#include "ctree.h"

CTree::CTree()
{
tree = NULL;
}

//PersonList::~MyTree()
//{
//
//}


bool CTree::IsEmpty()
{
if(tree == NULL)
{
return true;
}
else
{
return false;
}
}

void CTree::Add()
{
PersonRec* newPerson = new PersonRec();
cout << "Enter the person's name: ";
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cin.getline(newPerson->name, 20);
cout << "Enter the person's contribution: ";
cin >> newPerson->bribe;


newPerson->leftLink = NULL;
newPerson->rightLink = NULL;

AddItem(tree, newPerson);
}

void CTree::View()
{
if (IsEmpty())
{
cout<<"The list is empy";
}
else
{
DisplayTree(tree);

}

};

void CTree::AddItem( PersonRec*& ptr, PersonRec* newPer )
{
if (tree == NULL)
{
ptr = newPer;
}
else if ( newPer->bribe < ptr->bribe)
AddItem(ptr->leftLink, newPer);
else
AddItem(ptr->rightLink, newPer);
}
void CTree::DisplayTree(PersonRec* ptr)
{
if (ptr == NULL)
return;
DisplayTree(ptr->rightLink);
cout<<ptr->name<<" "<<"$"<<ptr->bribe <<endl;
DisplayTree(ptr->leftLink);
}


//Driver file
#include <iostream>

using namespace std;
#include <cstdlib>
#include "ctree.h"

int displayMenu (void);
void processChoice(int, CTree&);

int main (void)
{
int num;
CTree ct;
do
{
num = displayMenu();
if (num != 3)
processChoice(num, ct);
} while (num != 3);
return 0;
}

int displayMenu (void)
{
int choice;
cout << "\nMenu\n";
cout << "==============================\n\n";
cout << "1. Add student to waiting list\n";
cout << "2. View waiting list\n";
cout << "3. Exit program\n\n";
cout << "Please enter choice: ";
cin >> choice;
return choice;
}

void processChoice(int choice, CTree& myTree)
{
switch (choice)
{
case 1: myTree.Add (); break;
case 2: myTree.View (); break;
}
}

最佳答案

CTree::AddItem中,你的条件是错误的:

    if (tree == NULL)
{
ptr = newPer;
}

应该是

    if (ptr == NULL)
{
ptr = newPer;
}

当你调用 AddItem(ptr->rightLink, newPer); 时,newPer 是新节点,但是当前根的任何一个后代都可以是 NULL,所以这就是您需要检查 NULL 并替换的内容,而不是新节点。

关于c++ - 通过引用传递指针(插入二叉搜索树),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10659191/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com