基礎知識 | 每日一練(121)
- 2019 年 10 月 6 日
- 筆記
基礎知識練習
讀者:我想用 strcmp() 作為比較函數, 調用 qsort() 對一個字元串數組
排序, 但是不行。
小林:你說的 「字元串數組」 實際上是 「字元指針數組」。qsort 比較函數的參數是被排序對象的指針, 在這裡, 也就是字元指針的指針。然而 strcmp() 只接受字元指針。因此, 不能直接使用 strcmp()。
寫一個下邊這樣的間接比較函數:
/* 通過指針比較字元串 */
int pstrcmp(const void *p1, const void *p2)
{
return strcmp(*(char * const *)p1, *(char * const *)p2);
}
比較函數的參數表示為 「一般指針」 const void *。然後, 它們被轉換回本來表示的類型 (指向字元指針的指針), 再復引用, 生成可以傳入 strcmp() 的 char*。
讀者:怎樣對一個鏈表排序?
小林:在建立鏈表時就一直保持鏈表的順序要簡單些)。插入排序和歸併排序演算法用在鏈表最合適了。如果希望用標準庫函數, 可以分配一個暫時的指針數組, 填入鏈表中所有節點的地址, 再調用 qsort(), 最後依據排序後的數組重新建立鏈表。