0

リンクされたリストをトラバースするときのプログラムの動作に困惑しています。

整数のリンクされたリストが昇順であるかどうかを確認する関数を作成しています。そうでない場合は 1 を返し、そうでない場合は 0 を返します。これが私がこれまでに持っているものです:

int isasc(NodePtr top){

    NodePtr curr=top;

    if(top=NULL) return 0;

    while(curr!=NULL){

        if(curr->num > curr->next->num){ 
            return 0;
        }
        curr=curr->next;
    }
    return 1 ;
}

リストが昇順でない場合は機能しますが、昇順の場合はクラッシュします。何がうまくいかないのか考えはありますか?

4

3 に答える 3

3

次のものもあります。

if(top=NULL) return 0;

それはに割り当てNULLられてtopおり、条件は FALSE として扱われます。

于 2012-07-07T18:03:22.423 に答える
3

このコードには奇妙な点がいくつかあります。クラッシュする理由は、それcurr->next->numを確認せずにアクセスしているためcurr->nextですNULL

他にも腑に落ちないところがあります。ポインターtopは使用されず、比較もされずにNULL設定NULL、そのステートメントは常に に評価されNULLます。これは false です。

代わりに次のようにします。

int isasc(NodePtr curr)
{
    if(curr == NULL) return 0;

    while(curr->next != NULL)
    {
        if(curr->num > curr->next->num) 
            return 0;

        curr = curr->next;
    }

    return 1;
}
于 2012-07-07T18:07:13.093 に答える
1

ある時点curr->nextNULL. 関数はリストの最後に到達する前に容赦なく終了するため、コードは順不同の場合にのみ「機能」します。

プログラムを修正するには、逆参照する前にcurr->nextないことを確認してください。NULL

于 2012-07-07T18:00:16.980 に答える