2011-04-09 22 views
0
class sll_item 
{private: 
    sll_item *next_; 
    int code_; 
... 
... 

class sll_ 
{ private: 
    sll_item *first_; 
    sll_item *last_; 
... 
... 

sll_item* sll_ :: lookforitem(int code) 
{ 
    sll_item* aux = first_; 
    while(code != aux->getcode() && aux != NULL){ 
    aux = aux->getnext(); 
    } 
    return aux; 
} 

この関数はシンプルリンクリスト内の項目を探していますが、関数がそれを見つけられなかった場合、プログラムはセグメント違反を通知してクラッシュします(これは英語の名前だと思います)。関数がNULLへのポインタを返すことはできますか?

私は、見つかったかどうかを知りたいと思っています。ユーザーに見つからなかったメッセージなどを伝えたいのですが。ありがとう。

+0

はい、nullptr(ヌル、NULLまたはヌルではありません - 古い技です。現代的なスタイルでprogrammを使用する場合はnullptrキーワードを使用してください)fncによって "Not found"のインジケータとして返される可能性があります –

答えて

8

あなたは、問題のコードの私たちのすべてを示していないかもしれないが、これは右ここでの問題である:あなたがポインタ「AUX」を使用している

while(code != aux->getcode() && aux != NULL){ 

、それはNULLですかその後、テスト。それは良いことではありません;あなたは、ラウンドそれを他の方法を実行する必要があります。あなたはヌルかもしれないポインタを持っている場合は

while(aux != NULL && code != aux->getcode()){ 

は、あなたは常にそれを逆参照前にそれをチェックする必要があります。

+1

& -circuiting :) – garph0

+0

実際、@freinn、多分これを知っているかもしれませんが、 "&&"式では、部分式は左から右に評価され、最初のものが偽であれば、2番目の式は全く評価されません。 –

+0

私は短絡を知っていますが、リストの終わりを得る代わりに、コードを見つける可能性が高いとわかりました。ありがとう! – freinn

2
while(code != aux->getcode() && aux != NULL){ 
    aux = aux->getnext(); 
} 

あなたがaux->getcode()を書き込むことによって、最初のコードを取得し、その後auxがNULLでないかどうかを確認しようとしているのでauxは、NULLである場合は、[はい、それがクラッシュします。つまり、aux->getcode()aux != NULLの前に実行されます。

ここで、auxがNULLの場合はどうでしょうか? aux->getcode()がクラッシュします。

ループのように記述する必要があります。私はあなたが、あなたがatx->getcode()を使用することができ、AUXがNULLでないことをテスト、まずこの

while(aux != NULL&&code != aux->getcode()) 

のように使うべきだと思う

while(aux != NULL && code != aux->getcode()){ 
    aux = aux->getnext(); 
} 
+0

ありがとうございました!本当に!! – freinn

関連する問題