哈夫曼编码报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验项目:哈夫曼编码

#include

#include

#define MAXWORD 100

typedef struct

{ unsigned int weight;char data;

unsigned int parent,llchild,rrchild;

}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树typedef char * *HuffmanCode; / /动态分配数组存储哈夫曼编码表typedef struct tnode

{ char ch; //字符

int count; //出现次数

struct tnode *lchild,*rchild;

}BTree,*BT;

int a=0,b=0;int s[MAXWORD];char str[MAXWORD];

void main()

{ int n;int i=0;

HuffmanTree HT;HuffmanCode HC;

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int n);

void DispHCode(HuffmanTree HT,HuffmanCode HC,int n);

void Creatree(BT &p,char c); //Creatree()和InOrderTraverse() void InOrderTraverse(BT p); //利用二叉树统计出现的字符及个数void TTranChar(HuffmanTree HT,HuffmanCode HC,int n);

void Tran(HuffmanTree HT,int n);

printf("请输入要用几种字符:");

scanf("%d",&n);

BT root=NULL;

printf("\n");

printf("请输入字符串:\n");

scanf("%s",str);

while(str[i]!='\0')

{Creatree(root,str[i]);i++;}

printf("字符及出现次数:\n");

InOrderTraverse(root);

printf("\n");

HuffmanCoding(HT,HC,n);

DispHCode(HT,HC,n);

Tran(HT,n);

TTranChar(HT,HC,n);

}

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int n)

{ // w放n个权值,构造赫夫曼树HT,n个字符编码HC

void select(HuffmanTree t,int i,int &s1,int &s2);

int m,i,s1,s2,start;char *cd;unsigned c,f;

HuffmanTree p;

if(n<=1) return;

m=2*n-1;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

for(p=HT+1,i=1;i<=n;++i,++p)

{ (*p).parent=0;

(*p).llchild=0;

(*p).rrchild=0;

}

for(p=HT+1,i=0;i

{ (*p).data=str[i];

(*p).weight=s[i];

}

for(;i<=m;++i,++p)

(*p).parent=0;

for(i=n+1;i<=m;++i) // 建赫夫曼树

{ // 在HT[1~i-1]中选择parent为0且weight最小的两个,分别s1、s2 select(HT,i-1,s1,s2);

HT[s1].parent=HT[s2].parent=i;

HT[i].llchild=s1;

HT[i].rrchild=s2;

HT[i].weight=HT[s1].weight+HT[s2].weight;

}

HC=(HuffmanCode)malloc((n+1)*sizeof(char*));//([0]不用)

cd=(char*)malloc(n*sizeof(char));

cd[n-1]='\0'; // 编码结束符

for(i=1;i<=n;i++)

{ start=n-1; // 编码结束符位置

for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)

if(HT[f].llchild==c)

cd[--start]='0';

else

cd[--start]='1';

HC[i]=(char*)malloc((n-start)*sizeof(char));

strcpy(HC[i],&cd[start]); // 复制

}

free(cd);

}

void select(HuffmanTree t,int i,int &s1,int &s2) // s1为较小

{ int min(HuffmanTree t,int i);

int j;

s1=min(t,i);

s2=min(t,i);

if(s1>s2)

{j=s1;

s1=s2;

s2=j;

}

}

int min(HuffmanTree t,int i) // 函数void select()调用

{

int j,flag;

unsigned int k=100; // 取k比任何权值都大

for(j=1;j<=i;j++)

if(t[j].weight

相关文档
最新文档