1

任意の構造体ポインターの配列と比較関数を一般的な並べ替えアルゴリズムに渡したい。これはCで可能ですか?

構造体のグーイは比較関数内でのみアクセスされ、ソート関数は比較関数を呼び出してポインターを交換するだけで済みますが、それを宣言する方法がわかりません。

function sorter( struct arbitrary ** Array, int Length, int cmp(struct node * a, struct node * b))
{
    for (int i=0; i<Length;i++){
        if cmp(Array[i],Array[i+1]){
            swap(Array[i],Array[i+1]
       }
    }
}
4

4 に答える 4

3

関数は次のように宣言できます。

void sorter(void** the_array, size_t array_length, int (*comparison_function)(void*, void*));

次に、比較関数内で、比較対象の2つのポインターを、比較関数が比較す​​る構造体タイプへのポインターにキャストする必要があります。

于 2009-11-01T05:30:35.360 に答える
1

実際、この関数はすでに存在しています...それはと呼ばれqsortます。こちらのドキュメントをご覧ください。また、O(n ^ 2)である実装よりも効率的です。

于 2009-11-01T05:32:27.583 に答える
0

たぶん、voidポインタだけを渡す必要がありますか?

function sorter(void ** Array, int Length, int cmp(void * a, void * b))
于 2009-11-01T05:29:36.670 に答える
0

すべてのポインタをに変換できるという理由だけで、Cでは常に可能ですvoid*。ただし、それを任意の構造体へのポインターに戻すことができるようにする場合は、ある種の型IDが必要になります。

タイプに固有の関数を使用してこれを行うか(比較しているものが同じである場合)、または何らかの方法でタイプを構造にエンコードすることができます。これは、構造体に追加のフィールドを含めるか、cmp()関数自体を変更して型識別子を取得することで実行できます。

ただし、Cには、通常はかなり効率的な関数がすでにあることに注意してくださいqsort()(ただし、標準には、使用するアルゴリズムを指示するものはありません。バブルソートを使用しても、準拠している可能性があります)宿題用に実装している場合、または別のアルゴリズムを念頭に置いている場合を除いて、touはおそらくそれを使用する必要があります。

現状では、アルゴリズムはバブルソートの内部ループのように見え、そのため、実際には正しくソートされません。バブルソートは2つのネストされたループで構成され、通常、小さなデータセットまたは特定の特性を持つデータセット(ほとんどがすでにソートされているなど)にのみ適しています。

于 2009-11-01T05:31:07.463 に答える