为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

哈夫曼编码与译码

2017-09-19 21页 doc 41KB 21阅读

用户头像

is_842972

暂无简介

举报
哈夫曼编码与译码哈夫曼编码与译码 (1)输入一组字符集的大小、字符及权值,建立哈夫曼树,显示该哈夫曼树,并给出每个字符 的哈夫曼编码 (2)给出一串字符,按照已建立的哈夫曼树进行编码,显示结果或存入文件 (3)用(2)的结果,按照哈夫曼树进行译码 #include #include #include #define MAXLEN 10 typedef struct { int weight; int lchild; int rchild; int parent; char key; char mima[10...
哈夫曼编码与译码
哈夫曼编码与译码 (1)输入一组字符集的大小、字符及权值,建立哈夫曼树,显示该哈夫曼树,并给出每个字符 的哈夫曼编码 (2)给出一串字符,按照已建立的哈夫曼树进行编码,显示结果或存入文件 (3)用(2)的结果,按照哈夫曼树进行译码 #include #include #include #define MAXLEN 10 typedef struct { int weight; int lchild; int rchild; int parent; char key; char mima[100]; }htnode; typedef htnode hfmt[MAXLEN]; int n=0; typedef char elemtype; typedef struct { elemtype data[MAXLEN]; int front,rear; }seqqueue; void enqueue(seqqueue *q,char item) { q->data[q->rear]=item; q->rear=q->rear+1; } elemtype dequeue(seqqueue *q) { elemtype item; if(q->rear!=q->front) { item=q->data[q->front]; q->front=q->front+1; return item; } } seqqueue *initqueue(seqqueue *q) { q=(seqqueue *)malloc(sizeof(seqqueue)); q->front=q->rear=0; return q; } void inithfmt(hfmt t) { int i,j,k; FILE *p; char ch; i=0; p=fopen("1.txt","r"); if(fopen("1.txt","r")==NULL) printf("open error."); while((ch=fgetc(p))!=EOF) { for(k=0;kt[j].weight) { min1=t[j].weight; *p1=j; } } for(j=0;j<=i;j++) { if(t[j].parent==-1) if(min2>t[j].weight && j!=(*p1)) { min2=t[j].weight; *p2=j; } } } void creathfmt(hfmt t) { int i,p1,p2; inithfmt(t); for(i=n;i<2*n-1;i++) { selectmin(t,i-1,&p1,&p2); t[p1].parent=i; t[p2].parent=i; t[i].lchild=p1; t[i].rchild=p2; t[i].weight=t[p1].weight+t[p2].weight; } } void printhfmt(hfmt t) { int i; printf("\nthe hfmt is:\n"); printf("weight\tparent\tlchild\trchild\tkey\t"); for(i=0;i<2*n-1;i++) { printf("\n"); printf("%d\t%d\t%d\t%d\t%c\t%s",t[i].weight,t[i].parent,t[i].lchild,t[i].rchild, t[i].key); } printf("\n\n"); } void hfnode1(hfmt t,int i,int j) { int a,b; a=i; b=j=t[i].parent; if(t[j].parent!=-1) { i=j; hfnode1(t,i,j); } if(t[b].lchild==a) { printf("0"); } else { printf("1"); } } void huffmannode(hfmt t) { int i,j,a; printf("the code is:"); for(i=0;irear=q->front=0; } for(i=0;i
目 :哈夫曼编码和译码系统 基本要求:(1) 能输入字符集和各字符频度建立哈夫曼树; (2) 产生各字符的哈夫曼编码,并进行解码。 提高要求:(1) 能设计出简捷易操作的窗口界面; (2) 编码和译码存储在文件中。 #include #include #include #define N 100 #define M 2*N-1 typedef char * HuffmanCode[2*M];//haffman编码 typedef struct { int weight;//权值 int parent;//父节节点 int LChild;//左子节点 int RChild;//右子节点 }HTNode,Huffman[M+1];//huffman树 typedef struct Node { int weight; //叶子结点的权值 char c; //叶子结点 int num; //叶子结点的二进制码的长度 }WNode,WeightNode[N]; /***产生叶子结点的字符和权值***/ void CreateWeight(char ch[],int *s,WeightNode CW,int *p) { int i,j,k; int tag; *p=0;//叶子节点个数 //统计字符出现个数,放入CW for(i=0;ch[i]!='\0';i++) { tag=1; for(j=0;jht[j].weight?j:s1; ht[s1].parent=i; ht[i].LChild=s1; for(j=1;j<=i-1;j++) if(!ht[j].parent) break; s2=j; //找到第二个双亲不为零的结点 for(;j<=i-1;j++) if(!ht[j].parent) s2=ht[s2].weight>ht[j].weight?j:s2; ht[s2].parent=i; ht[i].RChild=s2; ht[i].weight=ht[s1].weight+ht[s2].weight;//权值累加 } } /***********叶子结点的编码***********/ void CrtHuffmanNodeCode(Huffman ht,char ch[],HuffmanCode h,WeightNode weight,int m,int n) { int i,c,p,start; char *cd; cd=(char *)malloc(n*sizeof(char)); cd[n-1]='\0';//末尾置0 for(i=1;i<=n;i++) { start=n-1; //cd串每次从末尾开始 c=i; p=ht[i].parent;//p在n+1至2n-1 while(p) //沿父亲方向遍历,直到为0 { start--;//依次向前置值 if(ht[p].LChild==c)//与左子相同,置0 cd[start]='0'; else //否则置1 cd[start]='1'; c=p; p=ht[p].parent; } weight[i].num=n-start; //二进制码的长度(包含末尾0) h[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(h[i],&cd[start]);//将二进制字符串拷贝到指针数组h中 } free(cd);//释放cd内存 system("pause"); } /*********所有字符的编码*********/ void CrtHuffmanCode(char ch[],HuffmanCode h,HuffmanCode hc,WeightNode weight,int n,int m) { int i,k; for(i=0;i
/
本文档为【哈夫曼编码与译码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索