?? 哈夫曼編碼.cpp
字號:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxValue 10
#define MaxBit 10
#define MaxN 10
#include"Haffman.h"
typedef struct
{
char zimu;
int cishu;
float pinlv;
}xinyuan;
void pinlvtongji(char wenben[],xinyuan x[],int *m) //英文文本頻率統計
{
int i,p,j,k;
int flag;
k=0;
p=strlen(wenben);
x[0].zimu=wenben[0];
x[0].cishu=1;
k++;
for(i=1;i<p;i++)
{
flag=0;
for(j=0;j<k;j++)
{
if(x[j].zimu==wenben[i])
{
x[j].cishu++;
flag=1;
break;
}
}
if(flag==0)
{
x[k].zimu=wenben[i];
x[k].cishu=1;
k++;
}
}
for(i=0;i<k;i++)
x[i].pinlv=(float)x[i].cishu/p;
printf("輸出英文文本統計后的各種字母:");
printf("\n");
for(i=0;i<k;i++)
printf("%c ",x[i].zimu);
printf("\n");
printf("\n");
printf(" 輸出各種字母對應的出現次數:");
printf("\n");
for(i=0;i<k;i++)
printf("%d ",x[i].cishu);
printf("\n");
printf("\n");
printf("輸出各種字母出現的頻率:");
printf("\n");
for(i=0;i<k;i++)
printf("%f ",x[i].pinlv);
printf("\n");
printf("\n");
*m=k ;
}
void main(void)
{
int i,j,k,n;
int m;
char english[100];
xinyuan aaa[24];
int weight[24];
printf("請輸入英文文本:");
printf("\n");
scanf("%s",english);
n=strlen(english);
printf("\n");
pinlvtongji(english,aaa,&m);
for(i=0;i<m;i++)
weight[i]=aaa[i].cishu;
HaffNode *myHaffTree=(HaffNode *)malloc(sizeof(HaffNode)*(2*m+1));
Code *myHaffCode =(Code *)malloc(sizeof(Code)*m);
Haffman(weight,m,myHaffTree);
HaffmanCode(myHaffTree,m,myHaffCode);
printf("輸出各種英文字母對應的哈夫曼編碼:");
printf("\n");
/*輸出每個葉節點餓哈夫曼編碼*/
for(i=0;i<m;i++)
{
/* printf("weight =%d Code=",myHaffCode[i].weight); */
for(j=myHaffCode[i].start;j<m;j++)
printf("%d",myHaffCode[i].bit[j]);
printf(" ");
}
printf("\n");
printf("\n");
printf("輸出英文文本對應的哈夫曼編碼:");
/*英文壓縮,即輸出英文文本對應的編碼*/
for(k=0;k<n;k++)
{
for(i=0;i<m;i++)
{
if(aaa[i].zimu==english[k])
{
for(j=myHaffCode[i].start;j<m;j++)
printf("%d",myHaffCode[i].bit[j]);
printf(" ");
}
}
}
printf("\n");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -