在类构造函数c ++中初始化struct数组

时间:2016-12-29 12:32:26

标签: c++ binary-search-tree

我尝试解决此银行帐户问题:

enter image description here

我想使用二叉树创建一个银行帐户程序,所以我使用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;
    }
}

2 个答案:

答案 0 :(得分:1)

根据问题1的要求,所有操作都应使用唯一的银行帐号进行。因此,您的二叉树使用银行帐号进行排序。

您的方法的一般问题

要回答问题2,您不能在一个节点中添加多个帐号:除非您要浏览所有节点,否则您将无法在树中找到其他帐户!完全像你在问题1中实现的那样保留树将回答问题2.它只是你的客户信息(名称)会重复,你将无法看到一个整体的平衡顾客。

您可以考虑以下几个选项:

  1. 什么都不做,只是使用重复的客户名称(毕竟,对此没有任何要求)。

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

  3. 保持ID和树不变。但是,不是使用名称,而是使用客户ID并管理第二个树以按名称维护客户,并保留客户拥有的所有银行帐户的列表(银行帐户ID的向量,您可以在第一个树中搜索) )。
  4. 代码中的问题

    createnewaccount()存在缺陷。当树为空(rootnullptr)时,您将取消引用空指针(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;
}

希望有所帮助