単連結リストの整列 #90 符号による整列は不要
前回の二つの例の結果から見えてくるように、
整数値の各桁を構成する数字にその整数値の符号を付けたもので順位を比較するようにした場合、
最後の符号による比較は不要になる。
それより前の段階で、負数よりも非負数の方が順位が上になるように自然に定義されているからである。
したがって、符号のみによる比較の機能を持つ順位定義関数は必要なく、
...snip static int issup(cintelem_t p, cintelem_t q, void *base) { int ip = intelem_get_val(p), iq = intelem_get_val(q); ip = ip >= 0 ? ip / (int)base % 10 : - (-ip) / (int)base % 10; iq = iq >= 0 ? iq / (int)base % 10 : - (-iq) / (int)base % 10; return ip > iq; } ...snip int main(void) { int i; intlist_t list = intlist_new(); srand(100); for (i = 0; i < 20; i++) intlist_add_first(list, (int)(rand() / (RAND_MAX + 1.0) * 1999) - 999); print(list); intlist_sort(list, issup, (void *)1); print(list); intlist_sort(list, issup, (void *)10); print(list); intlist_sort(list, issup, (void *)100); print(list); return 0; }
のようなコードでいい。
-521 357 -937 -770 -205 -296 8 195 983 454 -656 416 -896 507 -313 495 20 -669 -925 -977 -669 -937 -977 -296 -656 -896 -205 -925 -313 -521 -770 20 983 454 195 495 416 357 507 8 -296 -896 -977 -770 -669 -656 -937 -925 -521 -313 -205 507 8 416 20 454 357 983 195 495 -977 -937 -925 -896 -770 -669 -656 -521 -313 -296 -205 8 20 195 357 416 454 495 507 983
一段分、処理が少なくて済む。