- 日志
- 好友
- 卖家信用

- 买家信用

- 注册时间
- 2008-7-13
- 在线时间
- 小时
|
发表于 2009-7-18 00:28:41
|
显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#define N 26 //とりあえず、26固定 你的plist.txt里面是26行 所以这里固定了26 不过 实际上是不应
//该这样固定的 文件里面有几行 就应该动态的生成数组。。。 不过 那样程序就又更麻烦了 所以先就这
//么固定 以图方便
//下面这两个应该是 计算那个 哈夫曼码的固定的几个字符
char *s[N]; //={"a1","a2","a3","a4","a5","a6"}; 注释掉 下面用plist.txt里面的数字填充数组
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[i]=right[i]=parent[i]=0; //left=right=paprent=0; 明显错误 所以修改了
//下面也有一些这样的修改 就不一一说了 你自己对照一下
while(1){
for (i=0;i <size;i++)
if (f[i]>=0)
break;
if (i==size)
break;
dat1=i;
min=f[dat1];
for (i=0;i<size;i++)
if (f[i]<min && f[i]>0)
{
min=f[i];
dat1=i;
}//end if
for (i=0; i<size; i++)
if ((f[i]>=0)&&(i!=dat1))
break;
if (i==size)
break;
dat2=i;
min=f[dat2];
for (i=0;i<size;i++)
if (f[i]<min && f[i]>0 && i!=dat1)
{
min=f[i];
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]<0); //何がしたい? 不知道意思 注释掉了 也许需要这个 但是如果
//要这一行 可能会因为 参数里面那个 - 号 出错 我也不知道想做什么 你自己再看一看 或者告诉我
//这代码的 - 号到底是什么意思 我再看看该怎么改。。。
printf("1");
} else {
outenc(parent[huf]);
printf("0");
}//end if
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
//读文件的操作放在这里>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//读出文件里面的内容 写到s[], f[]数祖里面去。
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));
//plist.txtから読み込んだ値を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[i]); //修改了
outenc(i); //输出计算后的结果
printf("\n");
}//end for
return 0;
} |
|