为什么链表中的插入功能不起作用? (C ++)

时间:2016-05-11 18:26:47

标签: c++ linked-list segmentation-fault

我正在开发一个插入,删除银行帐户的程序。

这是我的.hpp代码:

#ifndef DEF_BANK
#define DEF_BANK

#include <iostream>

using namespace std;

class Bank
{

private:
    class _Account
    {
    public:
        _Account(string, float);
        string getClient();
        float getBalance();
        _Account *getNext();

        void setClient(string);
        void setBalance(float);
        void setNext(Bank::_Account *);

    private:
        string _client; //nom client
        float _balance; // stocke balance du compte
        _Account *_next; // next account
    };

    _Account *_head;
public:
    Bank();
    Bank(string name, float balance);
    _Account *rechercheClient(string);
    float withdraw(string, float);
    float deposit(string, float);
    void createAccount(string, float);
    void insert(string, float);
    void remove(string name);
    float deleteAccount(string);
    void mergeAccounts(string, string);
    void displayAccounts();

};

#endif

这是我的.cpp插入函数:

void Bank::insert(string name, float balance)
{
    _Account *temp(_head);
    //_Account *n = new _Account(name, balance); 
    bool flag(true);

    while(temp)
    {
        if (temp->getClient() == name)
        {
            /* code */
            cout << "DENIED OPERATION! --> "<< name <<"’s account already exists." << endl;
            flag = false;
        }

        temp = temp->getNext();
    }

    if (flag)
    {
        /* code */
        temp->setNext(new _Account(name, balance));
    }

}

为什么我在main.cpp中尝试这个:

int main()
{
    Bank account_1;
    account_1.insert("Hamza", 1000.0);
}

我遇到了分段错误:11?因为我没有在代码中看到我的错。

2 个答案:

答案 0 :(得分:4)

bool flag(true);

while(temp)
{
    if (temp->getClient() == name)
    {
        /* code */
        cout << "DENIED OPERATION! --> "<< name <<"’s account already exists." << endl;
        flag = false;
    }

    temp = temp->getNext();
}

if (flag)
{
    /* code */
    temp->setNext(new _Account(name, balance));
}

这没有意义。 一旦while指向temp,控制就会离开nullptr循环。然后,您尝试使用temp->setNext(new _Account(name, balance));取消引用该指针。这是未定义的行为。

答案 1 :(得分:0)

正如另一个答案指出的那样,你的循环是错误的。如果你改变了最后一行:

temp = temp->getNext();

到此:

if (temp->getNext()) {
    temp = temp->getNext();
} else {
    break;
}

然后你的循环应该停在列表中的最后一个元素而不是列表中最后一个元素之后的(不存在的)元素。

然而,真正的问题是你的老师认为这是教授初学者C ++的好方法。