2016-12-29 179 views
0

我试图解决这个银行帐户问题:初始化结构数组在类的构造函数C++

enter image description here

我想创建使用二叉树银行帐户程序,所以我使用了一个struct要输入帐户信息,但是,我面临的问题是我想创建一个struct的数组,以便当客户想要拥有多个帐户时,我想增加结构数组以输入第二个帐户信息

所以主要想法是我想在s中的多个帐户使用struct数组的ame二叉树节点。 有没有人有一个想法如何,我可以做到这一点,在main()我想创建一个新帐户同一个人

这里每次初始化数组是结构的内容

​​

我不知道如何把这些值在构造以及如何将其通过此功能

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; 
    } 
} 
+1

邮编不是图像。 –

+0

你可以保持'的std ::矢量账户;'你二叉树节点内。并了解[std :: vector](http://www.cplusplus.com/reference/vector/vector/) – sameerkn

+2

问题是什么? – 2016-12-29 12:47:47

回答

1

传递给构造函数根据问题1的要求,所有操作必须使用一个唯一的银行帐号进行。所以你的二叉树使用银行账号进行排序。

你的方法一般问题

要回答的问题2,你不能只在一个节点添加多个帐户号码:您将无法找到其他帐户在树中,除非你会探索所有的节点!完全按照您在问题1中实施树的方式保持树状结构将回答问题2。只是您的客户信息(名称)会重复,并且您无法看到客户的整体平衡。

有几种选择,你可以考虑:

  1. 什么也不做,只是生活在重复的客户名称(毕竟没有什么在这个要求)。

  2. 说出ID不再是银行ID,而是客户ID。账户ID将通过结合客户ID和顺序索引来获得。在这种情况下,您可以按照您的设想来管理一组帐户。然后问题就解析为解析账号来区分cusotmer id和index,并添加一个索引逻辑。

  3. 保持ID和树照原样。但不是名称,请使用客户ID并管理第二棵树以按名称维护客户,并列出客户拥有的所有银行帐户的列表(银行帐户ID的矢量,您可以在第一棵树中进行搜索)。在你的代码

问题

createnewaccount()是有缺陷的。当树为空时(rootnullptr),您将解引用空指针(prev->data):这是未定义的行为。为了解决这个最简单的方法是正确的开始功能的添加一种特殊情况:

if (root == nullptr) { 
    root = new Node (...); 
    return true; 
} 

一旦你已经解决了这个,你会发现,你的设计是根据每个节点的一个帐户的假设。如果你想每个节点的多个账户:

  • 你需要与功能扩展Node类,其他帐户添加到现有节点(构造函数总是创建一个新的节点)。
  • 你将如何找到一个现有客户的节点到新的帐户添加到现有的节点?

如何你如何看待这个问题解决了这个问题正确

无论如何,每个客户的多个银行账户要求能够找到每个帐户ID以及按客户的银行账户。这意味着要管理两棵树:一个按银行账户排序,另一个按顾客排序。

我认为这是howework,因为真正的代码,你永远不会开发一个二叉树,但只使用一个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。

然后,您可以用搜索会显示他的账户和资产负债列表中选择一个客户的丰富应用程序。

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; 
} 

希望帮助