2016-05-16 16 views
0
struct Edge 
{ 
    int src, dest, weight; 
}; typedef struct Edge Edge; 

struct Graph 
{ 
    int V, E; 
    Edge* edge; 
}; typedef struct Graph Graph; 

私はこのようなグラフ構造体を持っています。私はqsortを使用して、すべてのエッジを重みの高い順にソートしようとしています。メインで :qsort()グラフ構造の配列

Graph* graph = (Graph*)malloc(sizeof(Graph)); 
qsort(graph->edge, graph->E, sizeof(graph->edge[0]), myComp); 

MYCOMP機能:

int myComp(const void* a, const void* b) 
{ 
    Edge* a1 = (Edge*)a; 
    Edge* b1 = (Edge*)b; 
    return a1->weight > b1->weight; 
} 

は、すべての後、私はqソート前と後のすべてのエッジを印刷しようとしたが、順序が変更されているが、それは正しい順序ではありません。誰でもこれらを助けることができますか?私のコードのどの部分が間違っていますか?

+1

[** ** 'malloc'の戻り値をキャストしないでください!](https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858# 605858) –

+0

@TheParamagneticCroissant:... C.で、この質問がについてです – alk

+1

@alk ... :-)。コードとして –

答えて

2
return a1->weight > b1->weight; 

マニュアルから

return a1->weight - b1->weight; 

すべきである:

最初の引数をと考えている場合、比較関数は整数に等しい、より小さい、またはゼロより大きい返さなければなりませんそれぞれ第2のものよりも小さい、等しい、またはより大きい。 @のn.mによって解答に追加する

+0

イエス。ちょうどそれを修正してください。どうもありがとう。 –

0

何もありません。あなたは

typedef struct Edge 
{ 
    int src, dest, weight; 
} Edge; 

あるいは

typedef struct 
{ 
    int src, dest, weight; 
} Edge; 

を書く場合にのみ、タイプdef'd名Edgeを使用する場合は、あなたの宣言ビットをコンパクト化することができますし、必要はありませんが

基本型struct Edgeの明示的な名前。