你需要通過qsort()
預期函數的原型相匹配的結構比較功能,即:
int md_comparator(const void *v1, const void *v2)
{
const mydata *p1 = (mydata *)v1;
const mydata *p2 = (mydata *)v2;
if (p1->id < p2->id)
return -1;
else if (p1->id > p2->id)
return +1;
else
return 0;
}
如果你有機會到更復雜的排序標準,這仍然是一個很好的基礎,因爲你可以添加使用相同的骨架二級標準:
int md_comparator(const void *v1, const void *v2)
{
const mydata *p1 = (mydata *)v1;
const mydata *p2 = (mydata *)v2;
if (p1->latitude < p2->latitude)
return -1;
else if (p1->latitude > p2->latitude)
return +1;
else if (p1->longitude < p2->longitude)
return -1;
else if (p1->longitude > p2->longitude)
return +1;
else
return 0;
}
顯然,這將重複多個標準,你所需要的。 (?strcmp()
)如果您需要調用一個函數來比較值,調用它一次,但分配返回一個局部變量,並使用兩次:
int md_comparator(const void *v1, const void *v2)
{
const mydata *p1 = (mydata *)v1;
const mydata *p2 = (mydata *)v2;
int rc;
if (p1->latitude < p2->latitude)
return -1;
else if (p1->latitude > p2->latitude)
return +1;
else if (p1->longitude < p2->longitude)
return -1;
else if (p1->longitude > p2->longitude)
return +1;
else if ((rc = strcmp(p1->name_dyn, p2->name_dyn)) < 0)
return -1;
else if (rc > 0)
return +1;
else
return 0;
}
此外,當數據成員是無符號整數此模板工程,它在比較有符號整數時避免了溢出問題。需要注意的是捷徑,你有時可能會看到,在分別變化:
int md_comparator(const void *v1, const void *v2) /* BAD */
{ /* BAD */
const mydata *p1 = (mydata *)v1; /* BAD */
const mydata *p2 = (mydata *)v2; /* BAD */
return(p1->id - p2->id); /* BAD */
} /* BAD */
是壞的,如果id
是無符號(兩個無符號整數的差異從不爲負),並受溢出如果整數簽署和大幅度和相反的跡象。
你寫過一個函數,可以告訴你哪個給定的結構體有更大或更小的'id'字段? – sarnold 2012-01-04 02:09:37