ZBLOG

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

以下是补充代码:

int Search(char a[], char ch) {
    for(int i = 0; a[i] != '\0'; 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 - 1 - i; 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) {
    s1 = s2 = -1;
    for(int k = 0; k < n; k++) {
        if(HT[k].parent == -1 && (s1 == -1 || HT[k].weight < HT[s1].weight)) {
            s2 = s1;
            s1 = k;
        } else if (HT[k].parent == -1 && (s2 == -1 || HT[k].weight < HT[s2].weight)) {
            s2 = k;
        }
    }
}

void CreateHuffmanTree(HuffmanTree &HT, int n, int b[]) {
    m = 2 * n - 1;
    HT = new HTNode[m];
    
    for(int i = 0; i < m; i++) { // 初始化树的所有节点
        if(i < n) { 
            HT[i].weight=b[i]; 
        } else { 
            HT[i].weight=0;
        }       
        HT[i].parent=-i-2;//初始设置所有结点的双亲为-2
        HT[i].lchild=-1;
        HT[i].rchild=-1;
    }
    
    for(int i = n; i < m; i++) { // 创建哈夫曼树
        int s1, s2;
        Select_min(HT, i, s1, s2); // 选择权值最小的两个节点
        HT[s1].parent = i;
        HT[s2].parent = i;
        HT[i].lchild = s1;
        HT[i].rchild = s2;
        HT[i].weight = HT[s1].weight + HT[s2].weight; // 合并节点,更新权值
    }
}

void CreateHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n) {
    HC = new char*[n];
    
    char *code = new char[n];
    code[n-1] = '\0';
    
    for(int i = 0; i < n; ++i) {
        int current = i;
        int parent = HT[current].parent;
        
        while(parent != -1) {
            if(current == HT[parent].lchild)
                code[--n] = '0';
            else
                code[--n] = '1';
            
            current=parent;//向上回溯  
			parent=HT[current].parent; 
		}
		
		HC[i]=new char[strlen(code+ n)];  
		strcpy(HC[i],code+n);
	}
	
	delete[] code; //释放临时空间  
}

void PrintHT(HuffmanTree HT) {
    cout << "存储结构:" << endl;

	for (int k=0;k<m;k++)
	{
		cout << setw(3) << k << "   ";
		cout << setw(3) << HT[k].weight<< "   ";
		cout << setw(3) << HT[k].parent<< "   ";
		cout << setw(3) << HT[k].lchild<< "   ";
		cout << setw(3) << HT[k].rchild<< endl;
	}
}

void PrintHC(HuffmanCode HC, char a[], int j) {
    cout<<"编码表:" << endl;

	for (int k=0;k<j;k++)
	{
		cout<<a[k]<<" : "<<HC[k]<<endl;
	}
}

void CharFrequency(char ch[], char a[], int b[], int &j){
	int len = strlen(ch);

	for(int i=0;i<len;++i)
    {
        if(Search(a,ch[i]) == -1)
        { 
            a[j]=ch[i];
            b[j]++;
            ++j;     
        }
        else
        {
            ++b[Search(a,ch[i])];  
        }
    }
}

int main() {
	char ch[MAXSIZE];
	int i,j;
	
	while(cin>>ch)
	{
	    if(ch[0]=='0') break;
	    
	    HuffmanTree HT;
	    char a[MAXSIZE]={'\0'};
	    int b[MAXSIZE]={0};
	    j=0;      //j统计不同字符的数量
	    
	    CharFrequency(ch,a,b,j);   //统计词频
	    Sort(a,b,j);     //按ASCII码冒泡排序

        for(i=0;a[i]!='\0';i++)   //输出统计出来的字符和出现频率
        {
            if(a[i+1]!='\0')
                cout<<a[i]<<":"<<b[i]<<" ";
            else
                cout<<a[i]<<":"<<b[i]<<endl;
        }
        
        //构造哈夫曼树
        CreateHuffmanTree(HT,i,b);    //构造哈夫曼树HT
        PrintHT(HT);      //输出哈夫曼树的存储结构的终态
        
        //哈夫曼编码
        HuffmanCode HC;    //编码表HC
		CreateHuffmanCode(HT, HC, j);
		PrintHC(HC, a, j);    //输出每个字符的哈夫曼编码
		
		int k;
		
		for(i=0;ch[i]!='\0';i++)    //输出编码后的字符串
		{
			for(k=0;k<j;k++)
			{
				if(ch[i]==a[k])
					cout<<HC[k];
			}
		}
		
		cout << endl;
		cout << ch << endl;//输出解码后的字符串(与输入的字符串相同)
    }
    
	return 0;
}

请注意,以上代码是基于给定的补充部分进行修正和完善,但仍然可能存在一些错误或逻辑缺陷。在实际应用中,请根据具体需求进行验证和调整。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?