0

リンクされたリストのバブルソート機能に取り組んでいます。関数のヘッダーは次のとおりです。

void sort(struct lnode** head,
          void (*swapPtr)(struct lnode** head, struct lnode* n1, struct lnode* n2),
          int (*comparePtr)(void* v1, void* v2))

使用されている関数ポインターがよくわかりません。swapPtrリスト内の 2 つのノードを交換するために使用される関数への関数ポインタです。comparePtr3 つの関数の 1 つへのポインターとして使用されます。これらの関数はすべて、指定された単語のカウント数と行番号を格納するために使用される構造体の特定のメンバーの値を比較します。可能性は次のとおりです。

  1. countComp— 2 つのノードを取り、単語が現れる回数を比較し、等しい場合は 0、ノード 1 > ノード 2 の場合は 1、逆の場合は -1 を返します。

  2. wordComp— 指定されたノードの単語を比較し、上記と同じ戻り値を返します。

  3. lineComp— 上記と同じ戻り値で単語が出現する行番号を比較します。

バブル ソートのしくみと、ソートされたリストを作成するための一般的な手順を理解しています。私が混乱している領域は、呼び出す方法とcomparePtr、それに何を渡す必要があるかです。またtest.c、ソート方法のテストに使用するファイルもあります。sort 関数を呼び出すにはどうすればよいですか? 2 番目と 3 番目の引数に何を渡せばよいかわかりません。

誰かが私にこれを説明するのを手伝ってくれるなら、それは素晴らしいことです!

4

3 に答える 3

0

void sortList(node *start) { head = start;

for(ptr = head; ptr != NULL; ptr = ptr->next)
{
    for(newptr = ptr->next; newptr != NULL; newptr = newptr->next)
    {
        if(ptr->data > newptr->data)
        {
            int temp = ptr->data;
            ptr->data = newptr->data;
            newptr->data = temp;
        }
    }
}

}

特定のリンク リストをソートするためのこの C++ 関数は正常に動作しています。

于 2013-07-29T18:03:14.933 に答える
0

2 つの関数がある場合:

void intSwapPtr(struct lnode** head, struct lnode* n1, struct lnode* n2) {
    //definition
}

int intComparePtr(void* v1, void* v2) {
    //definition
}

次に、これらの関数を引数として渡すだけで sort を呼び出すことができます。関数は、引数として使用されると、関数へのポインターに暗黙的に変換されます。

swap(listHead, intSwapPtr, comparePtr)

swap の定義内で、and を呼び出すことができswapPtrcomparePtr他の関数を呼び出すのと同じ方法で、それらは暗黙的に逆参照されます。

于 2012-10-09T05:01:17.033 に答える
0

このヘッダーを作成した人は誰でも、comparePtr2 つのポインターを取り、ノードの順序でどのノードが「大きい」かを示す int を返すことを望んでいるように見えます。

したがって、次のように呼び出します。

lnode * a = ...;
lnode * b = ...;
int comparison = comparePtr(a, b);
if (comparison < 0)
{
    // we know a comes after b
}
else if (comparison > 0)
{
    // we know a comes after b
}
else
{
    // a and b are equal as far as ordering is concerned
}

これはRuby の宇宙船オペレーターのようなものです。

于 2012-10-09T05:02:05.990 に答える