2016-05-11 24 views
-3

私は、銀行から口座を挿入、削除するプログラムに取り組んでいます。ここで リンクリストの挿入機能が機能しないのはなぜですか? (C++)

は私.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

デバッガを使用する場合、 'Account * _head'の値は何ですか? – Soren

+0

質問:介入するリンクリストの実装の半分が銀行口座クラスに属しているのはなぜですか? –

+0

教師はそれをそうするように教えてくれました:) – IdelHamza

答えて

0

もう1つの答えが指摘したように、ループは間違っています。これに

temp = temp->getNext(); 

:あなたはこのからの最後の行を変更した場合

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

を次に、あなたのループが最後の要素の後に代わりに(実在しない)の要素のリストの最後の要素で停止する必要がありますリスト内の

しかし、実際の問題は、先生がこれが初心者のC++を教える良い方法だと思うことです。

+0

私はこれを試しますが、同じ問題:セグメント化の失敗:11。 – IdelHamza

+0

実際のコードは以下の通りです。void Bank :: insert(文字列名、浮動小数点数) { \t _Account * temp(_head); \t // _アカウント* n =新しい_Account(名前、残高); \t boolフラグ(true)。 \tながら、(一時) \t { \t \t場合(temp-> getClient()==名) \t \t { \t \t \t/*コード*/ \t \t \tはcout <<「DENIED OPERATION! - - > "<<名前<<"のアカウントは既に存在します。 " << endl; \t \t \t flag = false; \t \t} \t \t IF(temp-> getNextを()) \t \t { \t \t TEMP = temp-> getNextを()。他 \t \t} \t \t \t \t { \t \tブレーク。 \t \t} \t} \t場合(フラグ) \t {\t \t/*コード*/ \t \t temp-> setNext(新しい_Account(名前、バランス))。 \t} \t } – IdelHamza

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ループを1回だけ返します。tempnullptrを指します。次に、ポインタをtemp->setNext(new _Account(name, balance));で逆参照しようとします。それは未定義の行動です。

+0

それでは解決策は何ですか、私を助けてくれますか?私はC++の初心者です。 – IdelHamza

+0

@ I.Hamza https://en.wikipedia.org/wiki/Linked_listには、リンクされた各リスト操作のための疑似コードがあります。 –

関連する問題