基礎知識 | 每日一練(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(), 最後依據排序後的數組重新建立鏈表。

Tags: