text.c

来自「初学者可以看看的算法」· C语言 代码 · 共 92 行

C
92
字号
#include "text.h"

void main(void)
{
	char sArray[LENGTH];
	int nChance[LENGTH];
	short nCode[LENGTH];
	int nCount;
	printf("Please input the massage:\n");
	gets(sArray);
	nCount = strlen(sArray);
	fDelAdd(sArray,nChance,&nCount);
	fReSort(sArray,nChance,nCount);
	printf("Coding result:\n");
	if(nCount==1)
		printf("%c: %d\n",sArray[0],DEF_CODE);
	else
		fCoding(sArray,nChance,nCode,0,0,nCount,DEF_CODE);
}

void fDelAdd(char *pArray,int *pChance,int *pCount)
{
	int i,j;
	for(i=0;i<*pCount;++i)
		pChance[i] = 0;
	for(i=0;i<*pCount;++i)
	{
		++pChance[i];
		for(j=i+1;j<*pCount;++j)
			if(pArray[i]==pArray[j])
			{
				++pChance[i];
				--*pCount;
				pArray[j] = pArray[*pCount];
				--j;
			}
	}
}

void fReSort(char *pArray,int *pChance,int nCount)
{
	int i,j,TempInt;
	char TempChar;
	for(i=0;i<nCount;++i)
		for(j=i+1;j<nCount;++j)
			if(pChance[i]<pChance[j])
			{
				TempInt = pChance[i];
				pChance[i] = pChance[j];
				pChance[j] = TempInt;

				TempChar = pArray[i];
				pArray[i] = pArray[j];
				pArray[j] = TempChar;
			}
}

void fCoding(char *pArray,int *pChance,short *pCode,
			 int n,int nStart,int nEnd,int nState)
{
	int i,Position = 0;
	int Sum,PartSum1,PartSum2;
	Sum = PartSum1 = PartSum2 = 0;
	pCode[n] = nState;
	if(nEnd-nStart>1)
	{
		for(i=nStart;i<nEnd;++i)
			Sum += pChance[i];
		i = nStart;
		while(!Position)
			if(PartSum1<Sum/2)
			{
				PartSum2 = PartSum1;
				PartSum1 += pChance[i];
				++i;
			}
			else
				if((PartSum1-Sum/2)>(Sum/2-PartSum2))
					Position = i-1;
				else
					Position = i;
		fCoding(pArray,pChance,pCode,n+1,nStart,Position,LEFT_CODE);
		fCoding(pArray,pChance,pCode,n+1,Position,nEnd,RIGHT_CODE);
	}
	else
	{
		printf("%c: ",pArray[nStart]);
		for(i=1;i<=n;++i)
			printf("%d",pCode[i]);
		printf("\n");
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?