データ重複チェック関数プログラム



[ 簡単な説明 ]

ソート済データの重複チェックおよびそのデータの削除を行う関数です。
引数として、配列名、配列サイズ、データ削除フラグ(非0で削除、0は削除しない)を与えます。
各関数の戻り値は、重複データ数です。

重複データを削除する場合は、int 型、double 型、uchar 型配列の場合は前詰めにします。
文字列型配列では、重複データをヌル文字にするだけです。

int dbldel( )
int dbldel_i( )
int dbldel_d( )
int dbldel_c( )

プログラム・ソース("sort2.c")                             top (トップに戻る)
/*		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;
}