数据结构霍夫曼树实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
if(b[i]==a[t]) (*a1)[i+1]++;/*统计各类元素在字符串中元素的个数*/
}
i++;
}
/* for(i=1;i<=h;i++)
{
printf("%d ",(*a1)[i]);
}*/
printf("\n\n");
return h;
}
void InitTree(DataType *a,int n,HTNode **p,char *h)
}
printf("\n\noutput Huaffman bianma::\n");
for(i=0;i<strlen(w);i++)
{
for(t=1;t<=n;t++)
{
if(w[i]==h[t-1])
printf("%s",HC[t]);/*输出haffman编码*/
}
}
return ok;
}
int main(int argc, char* argv[])
else cd[--start]='1';
}
HC[i]=(char *)malloc((n-start)*sizeof(char));/*为每个字母的编码分配存储空间*/
strcpy(HC[i],&cd[start]);
printf("%c:%s\n",p[i].name,HC[i]);/*输出每一个字母的haffman编码*/
#include "string.h"
/*宏定义*/
#define ok 1
#define TRUE 1
#define FALSE 0
#define ERROR -1
#define overflow -2
#define max 100
/*替换*/
typedef int Status;
typedef int DataType;
for(i=1;i<=n;i++)
{
start=n-1;
for(a=i,b=p[a].parents;b;a=b,b=p[b].parents)/*从根节点开始遍历,找出根结点的父节点,
子节点为父节点的右儿子则编码为‘1’,左二子编码为‘2’*/
{
if(p[b].leftChild==a) cd[--start]='0';
{
char *cd;
char **HC;
int i=1,a,b,t;
int start=1;
cd=(char *)malloc(n*sizeof(char));
HC=(char **)malloc((n+1)*sizeof(char *));
cd[n-1]='\0';
printf("Haffman bianma::\n");
(*p)[t].leftChild=S1;(*p)[t].rightChild=S2;
(*p)[t].weight=(*p)[S1].weight+(*p)[S2].weight;/*S1、S2的weight之和作为父节点的weight*/
}
}
void show(HTTree *p,int n)
{
int i;
{
min2=(*p)[i].weight;
*b=i;
}
}
(*p)[(*b)].flag=1;
for(i=1;i<=n;i++)
{
if((*p)[i].weight==0)
{
break;
}
}
return i;
}
void CreatHT(HTNode **p,int n)
{
/*创建Huffman树*/
wk.baidu.comint i;
CreatHT(&p,n);
show(p,n);
HTencod(b,h,p,n);
printf("\n\n");
return 0;
}
图1:程序运行结果
以及各自的频率
• 利用统计信息生成Huffman树
• 利用生成的Huffman树进行编码, 对文件进行压缩, 形成一个压缩文
件(后缀名可以自己选择)
• 读入压缩文件并进行解压缩得到原始文件
三 实验结果与分析
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
for(i=1;i<=n;i++)
{
if((*p)[i].weight<min1&&(*p)[i].weight!=0&&(*p)[i].flag==0)
{
min1=(*p)[i].weight;
*a=i;
}
}
(*p)[(*a)].flag=1;
for(i=1;i<=n;i++)
{
if((*p)[i].weight<min2&&(*p)[i].weight!=0&&(*p)[i].flag==0)
实验报告
课程名:数据结构(C语言版)
实验名:Huffman树和Huffman编码
姓名:
班级:
学号:
撰写时间:2014.11.10
一实验目的与要求
1. 掌握生成Huffman树的过程
2. 掌握利用Huffman树进行编码实现数据压缩和解压缩
二实验内容
• 读入一个较长的文本文件, 例如提供的”kjv.txt”, 统计文中出现的字符
{
/*初始化Huffman树*/
int i;
*p=(HuffmanTree)malloc((2*n)*sizeof(HTNode));
for(i=1;i<=2*n;i++)
{
if(i<=n) /*将所有1...n的weight赋为a[1...n]*/
{
(*p)[i].weight=a[i];
(*p)[i].flag=0;
n++;
}
t++;
}
b[n]='\0';
/* printf("\n%d\n",h);*/
*a1=(int *)malloc((h+1)*sizeof(int));
for(i=1;i<=h;i++)
{
(*a1)[i]=0;
}
i=0;t=0;
while(b[i]!='\0')
{
for(t=0;a[t]!='\0';t++)
{
/*统计字符串中元素的种类*/
int t=0,i=0,h=0,n=0;
while(a[t]!='\0')
{
for(i=0;i<t;i++)
{
if(a[t]==a[i]) break;
}
if(i==t)
{
h++;
b[n]=a[t];/*将元素种类放到静态数组中*/
printf("%c",b[n]);
(*p)[i].rightChild=0;
(*p)[i].parents=0;
}
}
}
int Select(HTNode **p,int n,int *a,int *b)
{
/*返回线性表中第一个父节点为0的结点,并返回表中flag==0的两个最小的结点且a<b*/
int i;
int min1=100,min2=100;
(*p)[i].name=h[i-1];
(*p)[i].leftChild=0;
(*p)[i].rightChild=0;
(*p)[i].parents=0;
}
else/*将所有在n...2*n的weight赋为0*/
{
(*p)[i].weight=0;
(*p)[i].flag=0;
(*p)[i].leftChild=0;
/*数据结构*/
typedef struct HTTree{
DataType weight;
int flag;
char name;
int parents,leftChild,rightChild;
}HTNode,*HuffmanTree;
/*函数*/
int IpChar(char *a,int **a1, char *b)
int t;
int S1,S2;
for(i=n+1;i<2*n;i++)
{
t=Select(p,i,&S1,&S2);/*寻找p中i个数中最小的两个数的序号S1和S2,并返回parents的weight为0的序号,且S1<S2*/
(*p)[S1].parents=t; (*p)[S2].parents=t;/*将返回第一个weight为0的序号,作为S1和S2的父节点。S1作为左节点,S2作为右节点*/
printf("Output Huaffman's weight::\n");
for(i=1;i<2*n;i++)
{
printf("p[%d].weight=%d\n",i,p[i].weight);/*输出每个结点的权值*/
}
printf("\n\n");
}
int HTencod(char w[],char h[],HTTree *p,int n)
{
int *a1;
int n;
HTNode *p;
char b[100],h[50];
printf("Please input data's number char::");
gets(b);
strlen(b);
printf("%d \n",strlen(b));
n=IpChar(b,&a1,h);
InitTree(a1,n,&p,h);
相关文档
最新文档