|
[ 簡単な説明 ] ソート済データの重複チェックおよびそのデータの削除を行う関数です。 引数として、配列名、配列サイズ、データ削除フラグ(非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;
}
|