ZBLOG

#include #include #define MAXSIZE 100 using namespace std; typedef struct {//哈夫曼树结点的形式 int weight; //结点的权值 int parent,lchild,rchild; //结点的双亲、左孩子、右孩子的下标 }HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树 typedef char **...

很抱歉,我无法为您提供完整的代码实现。根据您给出的代码框架,这是一个基于字符频率构建哈夫曼树,并输出每个字符的哈夫曼编码的程序。

#include<iostream>
#include<string.h>
#define MAXSIZE 100
using namespace std;
typedef struct
{
    int weight;               //结点的权值
    int parent,lchild,rchild;  //结点的双亲、左孩子、右孩子的下标
}HTNode,*HuffmanTree;       //动态分配数组存储哈夫曼树
typedef char **HuffmanCode;   //定义编码表类型

int Search(char a[], char ch)
{
    int len = strlen(a);
    for(int i=0; i<len; i++)
    {
        if(a[i] == ch)
            return i;
    }
    return -1;
}

void Sort(char a[], int b[], int len)
{
    for(int i=0; i<len-1; i++)
    {
        for(int j=0; j<len-i-1; j++)
        {
            if(a[j] > a[j+1])
            {
                swap(a[j], a[j+1]);
                swap(b[j], b[j+1]);
            }
        }
    }
}

void Select_min(HuffmanTree HT, int n, int &s1, int &s2)
{
	int min = INT_MAX;
	for (int i = 1; i <= n; ++i) 
	{		
		if (HT[i].parent == 0 && HT[i].weight < min) 
		{			
			min = HT[i].weight;
			s1 = i;
		}
	}
	min = INT_MAX;
	for (int i = 1; i <= n; ++i)
	{		
		if (HT[i].parent == 0 && HT[i].weight < min && i != s1)
		{
			min = HT[i].weight;
			s2 = i;
		}			
    }
}

void CreateHuffmanTree(HuffmanTree &HT, int n, int b[])
{
    if(n <= 1)
        return;
    
    int m = 2 * n - 1; // 哈夫曼树总结点数
    HT = new HTNode[m+1];
    
    for(int i=1; i<=n; i++)
    {
        HT[i].weight = b[i-1];
        HT[i].parent = 0;
        HT[i].lchild = 0;
        HT[i].rchild = 0;
    }
    
    for(int i=n+1; i<=m; i++)
    {
        HT[i].weight = 0;
        HT[i].parent = 0;
        HT[i].lchild = 0;
        HT[i].rchild = 0;
    }
    
    for(int i=n+1; i<=m; ++i) 
    {	
	    int s1, s2;
	    Select_min(HT, i-1, s1, s2); 
	    HT[s1].parent=HT[s2].parent=i;//建立s1和s2的父节点
	    HT[s1].weight+=HT[s2].weight;//权值之和作为新节点的权值
	    HT[s2].parent=i;//修改双亲域
	    Sort(b, m);
    }
}

void CreateHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n)
{
    HC = new char*[n+1];
    
    char* cd = new char[n]; // 暂时存储每个字符的编码
    
    for(int i=1; i<=n; ++i) 
	{	
	    int start = n-1;
	    int c = i;
	    int p = HT[i].parent;
	    
	    while(p != 0)
        {
            --start;
            if(HT[p].lchild == c)
                cd[start] = '0';
            else
                cd[start] = '1';
            
            c = p;
            p = HT[p].parent;
        }
        
        HC[i] = new char[n-start];
        strcpy(HC[i], &cd[start]);
    }

    delete[] cd;
}

void CharFrequency(char ch[],char a[],int b[],int &j)
{
	int len=strlen(ch);
	j=0;//初始化数组元素下标

	for(int i=0;i<len;i++)//判断输入的字符串是否为空,若为空则停止循环
	{//开始处理字符串ch中每个字符
		int k=Search(a,ch[i]);
		if(k==-1)//找到a[]中没有重复的字符,新增一个出现的字符
		{
			a[j]=ch[i];//将新字符放入a[]中,j++表明要统计的不同字母数增加了1
			b[j++]=1;//与新添加进来的字符对应的词频为1.
		}
		else//在a[]中找到了相同字母,则把该字母对应b[k++]数值增1
			b[k]++;
	}
}

void PrintHT(HuffmanTree HT)
{
    for(int i=1; i<=m; ++i)
    {
        cout << "Weight: " << HT[i].weight;
        cout << "  Parent: " << HT[i].parent;
        cout << "  lChild: " << HT[i].lchild;
        cout << "  rChild: " << HT[i].rchild;
        cout << endl;
    }
}

void PrintHC(HuffmanCode HC, char a[], int j)
{
	for(int i=1;i<=j;++i) 
		cout<<a[i]<<" "<<HC[i]<<endl;//输出每个字符的哈夫曼编码
	
}

int main()
{
	char ch[MAXSIZE];    //存放输入的字符串ch[]
	char a[MAXSIZE];     //存放统计词频后的字符集合
	int b[MAXSIZE];      //存放与字符集合中每个字符对应的权值
	int n = 0;

	cout<<"请输入一串字符串:";
	cin>>ch;

	CharFrequency(ch, a, b, n);

	Sort(a,b,n);

	HuffmanTree HT;
	CreateHuffmanTree(HT, n, b);
	PrintHT(HT);

	HuffmanCode HC;
	CreateHuffmanCode(HT, HC, n);
	PrintHC(HC,a,n);

	return 0;
}

以上代码是基于给定输入字符串,统计字符频率,构建哈夫曼树,并输出每个字符的哈夫曼编码。请注意,代码可能还需要进一步优化和调试,以满足您的具体需求。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9888

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?