- 日志
- 好友
- 卖家信用

- 买家信用

- 注册时间
- 2008-7-13
- 在线时间
- 小时
|
发表于 2009-7-18 10:21:37
|
显示全部楼层
|
本帖最后由 等待UFO 于 2009-7-18 10:39 编辑
#include <stdio.h>
#include <stdlib.h>
#define N 26 //とりあえず、26固定
//下面这两个应该是 计算那个 哈夫曼码的固定的几个字符
char *s[N]; //={"a1","a2","a3","a4","a5","a6"}; 注释掉了 下面从文件读出来
float f[2*N-1]; //={0.35,0.15,0.15,0.20,0.10,0.05};
int size=N, parent[2*N-1], left[2*N-1], right[2*N-1];
//计算
void huff (void){
int i,j,dat1,dat2;
float min;
for (i=0;i<2*N;i++)
left=right=parent=0;
while(1){
for (i=0;i <size;i++)
if (f>=0)
break;
if (i==size)
break;
dat1=i;
min=f[dat1];
for (i=0;i<size;i++)
if (f<min && f>0)
{
min=f;
dat1=i;
}//end if
for (i=0; i<size; i++)
if ((f>=0)&&(i!=dat1))
break;
if (i==size)
break;
dat2=i;
min=f[dat2];
for (i=0;i<size;i++)
if (f<min && f>0 && i!=dat1)
{
min=f;
dat2=i;
}//end if
left[size]=dat1;
right[size]=dat2;
parent[dat1]=size;
parent[dat2]= -size;
f[size]=f[dat1]+f[dat2];
f[dat1]=-1;
f[dat2]=-1;
size ++;
}//end while
}
//输出结果
void outenc(int huf) {
if (huf== size-1)
return;
if (parent[huf]<0){
outenc(-parent[huf]); //这个地方修改了 不知道意思变没变
printf("1");
} else {
outenc(parent[huf]);
printf("0");
}//end if
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
//读文件的操作>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FILE *fp;
ファイルを開く
if( (fp=fopen("E:\\plist.txt","r"))==NULL ){
printf("The file is not found...");
return -1;
}//end if
char buff[256];
memset(buff,0x00,sizeof(buff)); //初期化
int iLnCnt = 0;
char chTmp[256];
float floatVal;
//plist.txtを最後まで読み込む
while(fgets(buff,sizeof(buff),fp)){ //1行ずつ読み込む
if(strlen(buff)<=0) //空行の場合
continue; //次の行を読み込む
memset(chTmp,0x00,sizeof(chTmp));
sscanf(buff,"%s %f",chTmp,&floatVal);
//ファイルのアルファベット文字を格納する一時メモリ確保
char* pch = (char*)malloc(sizeof(char)*5); //長さはとりあえず5固定
memset(pch,0x00,5);
strncpy(pch,chTmp,strlen(chTmp));
//读出文件里面的内容 写到s[], f[]数祖里面去。
s[iLnCnt] = pch;
f[iLnCnt] = floatVal;
iLnCnt++; //件数計数
if(iLnCnt==N) //26行を読んだらファイル読み込み終了(最大26行しか読み込まない)
break;
}//end while
if(fp)
fclose(fp);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
huff(); //ハフマン符号計算関数
for (i=0; i<N; i++)
{
printf("%s ",s);
outenc(i); //输出计算后的结果
printf("\n");
}//end for
return 0;
} |
|