我尝试解决此银行帐户问题:
我想使用二叉树创建一个银行帐户程序,所以我使用struct
输入帐户信息,但是,我面临的问题是我要创建一个数组struct
的{{1}},以便当客户想要拥有多个帐户时,我想增加struct数组以输入第二个帐户信息
所以主要思想是我希望使用struct
数组在同一个二叉树节点中拥有多个帐户。
有没有人知道如何在每次我想为同一个人创建新帐户时在main()
中执行此操作并初始化数组
这是结构的内容
struct info {
int id;
string name;
int balance;
};
class Node
{
public:
Node *left;
Node *right;
info myarray[3];
Node()
{
left = 0;
right = 0;
}
Node(Node * l, Node * r, int Id, int Balance, string Name)
{
left = l;
right = r;
}
};
我不知道如何将值放在构造函数中以及如何通过此函数将其传递给构造函数
bool createnewaccount(int id, int balance, string name)
{
Node *temp = root;
Node *prev = root;
while (temp != 0)
{
prev = temp;
if (id > temp->data.id)
temp = temp->right;
else if (id < temp->data.id)
temp = temp->left;
else
return false;
}
if (prev->data.id > id)
{
prev->left = new Node(0, 0, id, balance, name);
return true;
}
else
{
prev->right = new Node(0, 0, id, balance, name);
return true;
}
}
答案 0 :(得分:1)
根据问题1的要求,所有操作都应使用唯一的银行帐号进行。因此,您的二叉树使用银行帐号进行排序。
您的方法的一般问题
要回答问题2,您不能在一个节点中添加多个帐号:除非您要浏览所有节点,否则您将无法在树中找到其他帐户!完全像你在问题1中实现的那样保留树将回答问题2.它只是你的客户信息(名称)会重复,你将无法看到一个整体的平衡顾客。
您可以考虑以下几个选项:
什么都不做,只是使用重复的客户名称(毕竟,对此没有任何要求)。
假设该ID不再是银行ID,而是客户ID。然后,通过组合客户ID和顺序索引来获得帐户ID。在这种情况下,您可以按照您的设想管理一个帐户向量。然后将问题简化为解析帐号以区分cusotmer id和索引,并添加索引逻辑。
代码中的问题
createnewaccount()
存在缺陷。当树为空(root
为nullptr
)时,您将取消引用空指针(prev->data
):这是未定义的行为。解决这个问题的最简单方法是在函数开头添加一个特殊情况:
if (root == nullptr) {
root = new Node (...);
return true;
}
解决了这个问题后,您会注意到您的设计基于每个节点一个帐户的假设。如果您希望每个节点有更多帐户:
Node
类,以便向现有节点添加其他帐户(构造函数始终创建新节点)。 如何正确解决此问题
无论您如何看待问题,每个客户的多个银行帐户都需要能够找到每个帐户ID以及客户的银行帐户。这意味着要管理两棵树:一张按银行帐户排序,另一张按客户排序。
我认为这是多么的好,因为对于真正的代码,你永远不会开发二叉树,而只需使用std::map
。
所以我不会为你做功课,但这里有一个线索:
struct Info {
int id;
string name;
int balance;
};
class AccountNode // for your tree of unique bank accounts
{
public:
AccountNode *left;
AccountNode *right;
Info data;
AccountNode () : left(nullptr), right(nullptr) { }
AccountNode (AccountNode *l, AccountNode *r, int Id, int Balance, string Name):
left(l), right(l)
{
data.id = Id;
data.name = Name;
data.balance = Balance;
}
};
class CustomerNode { // for a second tree of unique customers
public:
CustomerNode *left;
CustomerNode *right;
std::string name; // in reality, you'd use a struct for address and contact infos
std::vector<int> accounts; // or an array if you're not allowed to use vector
CustomerNode() : left(nullptr), right(nullptr) { }
CustomerNode(CustomerNode * l, CustomerNode * r, string Name):
left(l), right(l), name(Name) { }
};
使用此结构,无论何时创建新帐户,在已在唯一银行帐户ID树中添加帐户后,如果客户已存在,您将在客户树中进行搜索。如果没有,则创建它。在所有情况下,您都要向客户的节点(在第二个树中)添加新帐户的ID。
然后,您可以通过搜索显示其帐户列表及其余额的客户来丰富您的应用程序。
答案 1 :(得分:0)
对于可以自由添加和删除对象的结构,可以使用vector<info>
,但如果需要数组,可以执行以下操作:
info *myarray;
info(int size){ //constructor
myarray = new info[size];
//...
}
如果您想扩展数组的大小并维护当前元素,您可以:
void expand(int currentSize, int newSize){
info newArray = new info[newSize];
for(int i = 0; i < currentSize; i++){
newArray[i] = myarray[i];
}
myarray = newArray;
}
希望有所帮助