2012-02-12 11 views
0

私はintを保持する構造体を持っています。ポインタへのポインタの配列の並べ替え

typedef struct n { 
    int cars; 
    struct n *next; 
} node; 

私はリンクリストで始まり、その後、それを通過し、配列に追加しますので、このようなnode *temp; などのノードはこれがあることを確認してください。その後、だから私は、ポインタへのポインタの配列を持つ配列node **arr;

に追加され

。私の質問です:私はこれでqsortを行うことができますか?私は難易度のqsortが実際に指しているものを考え出すを抱えている

qsort(arr, numberCars, sizeof(node), sortCars); 

int sortCars(const void *i1, const void *i2){ 
    node *a = (node*)i1, *b = (node*)i2; 
    return (a->cars - b->cars); 
} 

:今までの私の試みがもたらしました。

答えて

1

あなたはポインタの配列を持っているので、あなたの関数が間に比較する必要がありますポインタ:

int sortCars(const void *i1, const void *i2){ 
    node *a = *(node**)i1, *b = *(node**)i2; 
    return (a->cars - b->cars); 
} 

Als oの場合、sizeof(node)の代わりにsizeof(node*)を渡す必要があります。

BTW、qsort配列内の要素はソートされますが、効果はありませんnext、したがって、リンクされたリストはソートされません。

0

ノードにnextポインタがある場合は、リンクリストが示唆されます。それは配列と同じではありません。連続したメモリブロックにすべての構造体を割り当てていますか?これはソートアルゴリズムが最初の引数として必要とするものです。

typedef struct n { 
    int cars; 
} node; 

node arr[10]; // ten nodes as an array 

(どのように一般的なソート機能を使用すると、定義された構造体のnextポインタを更新するために知っているだろう?)

またarrnode **arrであれば、それはポインタへのポインタの配列ではありません。これは、ポインタへのポインタ、または(ほぼ同等の)配列の配列、配列へのポインタ、またはポインタの配列です。

+0

私はそれらをリンクリストとして設定し、それから配列を作成しました。 – RichInDreams

0

コンパレータ機能がint返す必要があります。

int sortCars(const void *i1, const void *i2) 

アンも、あなたは、この機能は、よりシンプル行うことがあります。

int sortCars(const void *i1, const void *i2){ 
    return ((*((node**) i1))->cars - (*((node**) i2))->cars); 
}