数据结构实验9
题目:根据哈夫曼(Huffman)编码的原理,编写一个程序,在用户输入节点权重的基础上建立它的哈夫曼编码。
test.h
#include<stdio.h> #include<malloc.h> #define Max 20 #define MaxValue 1000 typedef struct huffNode { char ch; int weight; int lChild; int rChild; int parent; char hCode[Max]; }huffman; void init(huffman *huffmanTree,int *w,char *z,int n) { int i; //for(i=0;i<2*n-1;i++) // huffmanTree[i]=(huffman *)malloc(sizeof(huffman)); for(i=0;i<2*n-1;i++) { huffmanTree[i].ch=z[i]; huffmanTree[i].weight=w[i]; huffmanTree[i].parent=-1; huffmanTree[i].lChild=-1; huffmanTree[i].rChild=-1; } } void setHuffmanTree(huffman *huffmanTree,int n) { int m,m1,m2,x1,x2,i,j; m=2*n-1; for(i=n;i<m;++i) { m1=m2=MaxValue; x1=x2=0; for(j=0;j<i;++j) { if(huffmanTree[j].parent==-1&&huffmanTree[j].weight<m1) { m2=m1;x2=x1;m1=huffmanTree[j].weight;x1=j; } else if (huffmanTree[j].parent==-1&&huffmanTree[j].weight<m2) { m2=huffmanTree[j].weight;x2=j; } } huffmanTree[x1].parent=i; huffmanTree[x2].parent=i; huffmanTree[i].lChild=x1; huffmanTree[i].rChild=x2; huffmanTree[i].weight=m1+m2; } } void huffmanTreeCode(huffman *huffmanTree,int n) { char hc[Max]; int hcLen; int i,j,k,parent,p; for(i=0;i<n;i++) { hcLen=0; parent=huffmanTree[i].parent;//待编码字符的双亲结点下标 p=i; while(parent!=-1)//未到达根结点 { if(huffmanTree[parent].lChild==p)//是左孩子 hc[hcLen]='0',hcLen++; else if(huffmanTree[parent].rChild==p)//是右孩子 hc[hcLen]='1',hcLen++; p=parent; parent=huffmanTree[parent].parent;//继续向根结点查找 } for(j=0,k=hcLen-1;j<hcLen;j++,k--)//将编码写入相应字符数组 huffmanTree[i].hCode[j]=hc[k]; huffmanTree[i].hCode[j]='\0';//加上字符串结束符 } return; }
test.c
#include"test.h" #include <iostream.h> int main() { int n,i; char z,*Z; int w,W[Max]; huffman huffmanTree[Max]; printf("请输入叶子个数:\n"); scanf("%d",&n); //W=(int *)malloc(n*sizeof(int)); Z=(char *)malloc(n*sizeof(char)); printf("请输入%d个字符和权值。\n",n); for(i=0;i<n;i++) { printf("请输入第%d个字符:\n",i+1); //scanf("%c",&z); cin>>z; Z[i]=z; printf("请输入第%d个字符的权:\n",i+1); //scanf("%d",&w); cin>>w; W[i]=w; } init(huffmanTree,W,Z,n); setHuffmanTree(huffmanTree,n); huffmanTreeCode(huffmanTree,n); for(i=0;i<n;i++) { printf("%c:%s\n",huffmanTree[i].ch,huffmanTree[i].hCode); } return 0; }