哈夫曼编码/译码的设计与实现

首先根据给定的n个字符的权值构造哈夫曼树。通过遍历此二叉树完成各字符的哈夫曼编码,另输入一组‘0’、‘1’代码构成的报文将其翻译成对应的字符信息。

废话不说直接上代码:

#include
#include
#define  UINT_iMAX 10000 
using namespace std;

typedef struct {
	char letter, *code;
	int weight;
	int parent, lchild, rchild;
}HTNode, *HuffmanTree;
 

int n;
char coding[100];

int Min(HuffmanTree &HT,int i)  
{  
    //在HT[1...i]中选择parent为0且权值最小的结点  
    //返回该结点的下标值  
    //此函数被Select函数调用  
    int j;  
    unsigned int k = UINT_iMAX;//假设各结点的权值不会超过UINT_MAX  
    int flag;  
    for(j = 0; j <= i; ++j)  
    {  
        if(HT[j].weight < k && HT[j].parent == 0)//用父结点是否为0来判断此结点是否已经被选过  
        {  
            k = HT[j].weight;  
            flag = j;  
        }  
    }  
    HT[flag].parent = 1;//作个标记,说明已经被选择了,因为在Select函数中要选择权值小的两个结点  
    return flag;  
}  
  
void Select(HuffmanTree &HT, int i, int &s1, int &s2)  
{  
    //在HT[1...i]中选择parent为0且权值最小的两个结点,其序号分别为s1,s2  
    //s1 <= s2  
    s1 = Min(HT,i);  
    s2 = Min(HT,i);  
}  


void CreateHuffmanTree(HuffmanTree &HT, char t[], int w[])
{
	//cout<<"nihao1"<=n)
		{
			a[n]=buff[i];
			b[n]=1;
			n++;
		}
 	}

//	cout<>p; 
   			if(p!='1'&&p!='0'&&p!='#'){ //若存在其它字符,x设为0,表示输入的不是二进制
   			 	x=0;
   			}
  			coding[k]=p;
   			if(p=='#')  
    		symbol=0;  //#号结束标志
  
  			 k++;
  		}
 		 if(x==1){

  		HuffmanTreeYima(HT,coding,k-1);        //进行译码

  		}
  		else{
  			 cout<<"有非法字符!"<>p;
	  if(p=='y'||p=='Y')
	   continue;
	  else
	   break;
 	}
    
    
    return 0;  
}  
运行结果如图:
哈夫曼编码/译码的设计与实现_第1张图片 哈夫曼编码/译码的设计与实现_第2张图片

你可能感兴趣的:(数据结构)