哈夫曼文件压缩实验报告.docxVIP

  • 19
  • 0
  • 约6.97千字
  • 约 19页
  • 2021-04-15 发布于天津
  • 举报
专业 专业.专注 数据结构实验报告三 哈夫曼文件压缩 实验题目:哈夫曼文件压缩 实验目标: ,并计算压缩比输入一个有10k单词的英文文档。 ,并计算压缩比 栈和哈夫曼树。 定义栈() typedef struct{ char *elem; int stacksize; int top;}STACK; 定义哈夫曼树 () typedef struct{ int weight; int left,right; in t pare nt;}HTNode; 需要的操作有: 初始化栈 (Initstack ) void In itstack(STACK *s){ s-elem=(char *)malloc(sizeof(i nt)*1OOO); s-stacksize=1000; s-top=-1; 压栈(push ) void push(STACK *s,int e){ s_elem[++s_top]=e; } 弹栈(pop ) void pop(STACK *s,i nt *e){ if(s-top!=-1) *e=s_elem[s_top__]; } 构造哈夫曼树 (Inithuffman ) void Inithuffman(int wset[n],int k,HuffTree HT[]){ // 构造哈夫曼树 int i,m; int s1,s2; m=k*2-1; for(i=0;im;i++){ // 初始化 HT 数组 HT[i]=(HuffTree)malloc(sizeof(HTNode)); HT[i]-weight=(ik?wset[i]:O); HT[i]-pare nt=-1; HT[i]-left=HT[i]-right=-1; } for(i=k;im;i++){ //主循环,完成n-1次合并 select(HT,k,i, s1, s2);// 在 HT[1...i-1]中选择 pare nt 为 0 select(HT,k,i, s1, s2); 且weight为最小的两个结点,其下标分别为s1和s2 HT[i]-left=s1; HT[i]-right=s2; HT[i]-weight=HT[s1]-weight+HT[s2]-weight; HT[s1]-pare nt=HT[s2]-pare nt=i; } } 其中用到另一个基本操作:找到哈夫曼树中最小和次小的结点 (select) 找到哈夫曼树中最小和次小的结点 (select) void select(HuffTree HT[255],int a,int i,int *p,int *q){ int j=0,k=0,*HT1,temp; HT1=(i nt *)malloc(sizeof(i nt)*(i-1)); // 存放权值 for( j=0;ji;j++){ if(HT[ j]-parent==-1){ HT1[k]=HT[j]-weight; //把没有pare nt的结点的权值放在 HT1 中 k++; } // printf(%4d%4d%4d%4d%4d\n,HT[j]-parent,HT[ j]-left,HT[ j]-right,HT[ j]-wei ght,HT1[k-1]); j=0; while( j2) { //找到权值最小和第二小的结点 for(k=j;k(i-(i-a)*2);k++){ if(HT1[j]HT1[k]){ temp=HT1[k]; HT1[k]=HT1[j]; HT1[j]=temp; } } j++; } k=0; for( j=0;ji;){ if(HT[ j]-parent==-1) if(HT[ j]-weight==HT1[0]k1){ // 将最小的权值赋到 *p 中 *p=j; k++; } j++; } for( j=0;ji;){ if(HT[ j]-parent==-1) if(j!=*P) //将第二小的权值赋到 //将第二小的权值赋到 *q 中 *q=j; k++; } j++; // prin tf(%4d%4d%4d%4d\n,HT[i]-pare nt,HT[i]-left,HT[i]-right,HT[i]-weight); } } 根据哈夫曼树得到各字符对应的哈夫曼编码 (Huffman ) void Huffman(HuffTree HT[2*n-1],int k,char str[][20]){ int i,j,e,t1=0,t2=0; char c; STACK st; for(i=0;ik;i++){ if(HT[i]-right==-1 HT[i]-left==-1){ // 找一个叶子结点 In itstack(st); HT[i]-right=H

文档评论(0)

1亿VIP精品文档

相关文档