3

ダブルポインターメソッドを使用する、リンクされたリストの中間要素を返す次の関数を作成しました

struct node
{
int data;
struct node *next;
}*start;

void middleelement()
{
struct node *x=start,*y=start;
int n=0;

if(start==NULL)
{
    printf("\nThere are no elments in the list");
}

else
{
    while((x->next)!=NULL)
    {
        x=x->next->next;
        y=y->next;
        n++;
    }

    printf("\nMiddle element is %d",y->data);
}
}

しかし、関数を実行するたびに、Windows エクスプローラーが動作しなく なります。コードの欠陥は何ですか? 中間要素を見つけるために、これよりも優れたアルゴリズムはありますか?

4

1 に答える 1

2

エントリの数が奇数の場合、 は になりますxNULLそのため、次のループ反復でそれが参照されると、プログラムがクラッシュします。それを考慮して条件を変更する必要があります。

while(x && x->next) {
    ...
}

NULLC では比較はオプションであるため、 をスキップし!= NULLて条件を短縮できます。

もちろんstart、控えめに言っても、グローバル変数を介してパラメーターを渡すことは非正統的です。通常の関数パラメーターとして渡す方がはるかに優れています。

于 2012-07-13T15:50:22.463 に答える