単連結リストの整列 #89 補数にしない
負数から10進数での各桁の数字を取り出すときに9からその数字を減じた値でもって比較した。
つまり、10進法での9の補数で順位を定義したことになる。
しかし、わざわざ補数表現にせずに、
負数の場合はその桁の数字に負符号を付けたものを値とすることでも問題ないと思われ。
つまり、負数の各桁の数字が1の時は-1、2の時は-2、……というように。
...snip static int issup(cintelem_t p, cintelem_t q, void *base) { if (base == 0) { return intelem_get_val(p) >= 0 && intelem_get_val(q) < 0; } else { 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
この順位定義関数で実行すると、
-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 -977 -937 -925 -896 -770 -669 -656 -521 -313 -296 -205 8 20 195 357 416 454 495 507 983
百の位が0の場合、負数でも非負数でも順位決めに使う値は0となり、その区別がつかなくなる。
が、これは9の補数表現を利用していた時の負数の0と正数の9の区別がつかないのと同じであり問題ない。
たとえば、
...snip int main(void) { int i; intlist_t list = intlist_new(); for (i = 0; i <= 20; i++) intlist_add_first(list, i * 10 - 100); print(list); ...snip
のようなコードなら、
100 90 80 70 60 50 40 30 20 10 0 -10 -20 -30 -40 -50 -60 -70 -80 -90 -100 100 90 80 70 60 50 40 30 20 10 0 -10 -20 -30 -40 -50 -60 -70 -80 -90 -100 -90 -80 -70 -60 -50 -40 -30 -20 -10 100 0 -100 10 20 30 40 50 60 70 80 90 -100 -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90 100 -100 -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90 100