[ 簡単な説明 ] ソート済データの重複チェックおよびそのデータの削除を行う関数です。 引数として、配列名、配列サイズ、データ削除フラグ(非0で削除、0は削除しない)を与えます。 各関数の戻り値は、重複データ数です。 重複データを削除する場合は、int 型、double 型、uchar 型配列の場合は前詰めにします。 文字列型配列では、重複データをヌル文字にするだけです。 |
int dbldel( ) |
int dbldel_i( ) |
int dbldel_d( ) |
int dbldel_c( ) |
/* sort2.c 整列データの重複チェック&削除 */ #include <stdio.h> #include "sort.h" int dbldel_i(int a[], int n, int flag) { int i, nn; int *dp, *wp; nn = 1; wp = dp = a + 1; for(i = 1; i < n; i++, dp++) { if(*(dp - 1) - *dp) { if(wp != dp && flag) *wp = *dp; wp++; nn++; } } if(flag) for(i = nn; i < n; i++) *wp++ = 0; return nn; } int dbldel(uchar a[], int n, int flag) { int i, nn; uchar *dp, *wp; nn = 1; wp = dp = a + 1; for(i = 1; i < n; i++, dp++) { if(*(dp - 1) - *dp) { if(wp != dp && flag) *wp = *dp; wp++; nn++; } } if(flag) for(i = nn; i < n; i++) *wp++ = '\0'; return nn; } int dbldel_d(double a[], int n, int flag) { int i, nn; double *dp, *wp; nn = 1; wp = dp = a + 1; for(i = 1; i < n; i++, dp++) { if(*(dp - 1) - *dp) { if(wp != dp && flag) *wp = *dp; wp++; nn++; } } if(flag) for(i = nn; i < n; i++) *wp++ = 0.; return nn; } int dbldel_c(uchar *a[], int n, int flag) { int i, nn; uchar **dp, **wp; nn = 1; wp = dp = a + 1; for(i = 1; i < n; i++, dp++) if(strcmp(*(dp - 1), *dp)) nn++; if(nn != n && flag) { wp = a; dp = a + 1; i = n - nn; while(i > 0) { if(strcmp(*wp, *dp) == 0) { **dp = '\0'; i--; } else wp = dp; dp++; } } return nn; } |