0
回答
哈夫曼编码,编码时候不能输出编码!帮忙看看哪里有错,大概是编码算法的while循环有问题帮忙看看,谢谢
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define n 6//定义字符数n为6
#define  m 2*n-1

typedef struct 
{
	float weight;
	int lchild;
	int rchild;
	int parent;
}codenode;
typedef codenode huffmantree[m];//哈夫曼树结构
typedef struct 
{
	char ch;
	char bits[n+1];
}code;//编码结点
typedef code huffmancode[n];//编码结构
void init(huffmantree t)//哈夫曼树的初始化
{
	int i;
	for(i=0;i<m;i++)
	{
		t[i].weight=0;//定义权值为零
		t[i].parent=-1;//定义父母为-1
		t[i].lchild=-1;//定义左孩子为-1
		t[i].rchild=-1;//定义右孩子为-1
	}
}
void input(huffmantree t)//输入哈夫曼树的数据
{
	int i;//输入i
	float k;//定义单精度浮点数k
	printf("请输入%d个结点的权值:",n);
    for(i=0;i<n;i++)
	{
		scanf("%f",&k);//输入k
		t[i].weight=k;//权值为k
	}
}
void selectmin(huffmantree t,int k,int *p1,int *p2)//找出最小的两个数用p1,p2返回
{
	int i;
	float small1=10000,small2=10000;
	for(i=0;i<=k;i++)
	{
		if(t[i].parent==-1)//如果t[i].parent==-1
			if(t[i].weight<small1)//如果权值<small1
			{	small2=small1;//将small1的值赋给small2
			      small1=t[i].weight;//权值=small1
				  *p2=*p1;
				  *p1=i;
			}
			else if(t[i].weight<small2)//如果权值<small2
			{
				small2=t[i].weight;
				*p2=i;
			}
	}
	if(*p1>*p2)
	{
		int t=*p1;
		*p1=*p2;
		*p2=t;
	}
}
void creattree(huffmantree &t)//建哈夫曼树
{
	int i,p1,p2;
	init(t);
	input(t);
	for(i=n;i<m;i++)
	{
		selectmin(t,i-1,&p1,&p2);//在所有权值中选择两个最小的数分别p1,p2
			t[p1].parent=t[p2].parent=i;//p1父母的值=p2父母的值=i
		    t[i].lchild=p1;
			t[i].rchild=p2;
			t[i].weight=t[p1].weight+t[p2].weight;
	}
}
void creatcode(huffmantree &t,huffmancode &h)//哈夫曼编码表
{
	int i,c,p,start;
	char cd[n+1];//分配求编码的工作区间(每个字符编码结果最长n再加上:'\0')
	cd[n]='\0';//结束编码符
    printf("请输入%d个字符作为电文内容:",n);
	for(i=0;i<n;i++)//逐个字符求哈夫曼编码
	{
	    h[i].ch=getchar();//在这里它只返回输入字符串的第一个字符,并把返回值赋值给h[i].ch
		start=n;
	
		c=i;

        while(p=t[c].parent<=0)
		{
			cd[--start]=(t[p].lchild==c)?'0':'1';//从根开始根据'0','1'选择找lchild还是rchild,直至叶子节点,解码出一个数据单位。在从根开始
			
			printf("jshj");
			c=p;
		}

		strcpy(h[i].bits,&cd[start]);//字符串复制函数(将cd[start]内容h[i].bits)
	}
	printf("电文的哈夫曼编码如下:");
	for(i=0;i<n;i++)//逐个字符求哈夫曼编码
	{
		printf("\n%c  %s",h[i].ch,h[i].bits);
	}
}
void zip(huffmancode &h,char *ch,char *s)//编码
{
	int j=0;
	unsigned int i;//位域bit
	for(i=0;i<strlen(ch);i++)//判断循环次数
	{
		while(ch[i]!=h[j].ch&&ch[j])
			j++;
		strcat(&s[0],h[j].bits);
		j=0;
	}
    printf("%s的编码:",ch);
	puts(s);
}
void uzip(huffmancode h,char *s,huffmantree t)//解码
{
	int j=0,p;
	unsigned int i=0;//位域bit i=0
	char ch[n+1];//分配求解码的工作空间
	while(i<strlen(s))//判断i是否<s
    {
		p=m-1;
		while(t[p].lchild!=-1)
		{
			if(s[i]=='0')
			{
				p=t[p].lchild;i++;//p指向左孩子
			}
			else
			{
				p=t[p].rchild;i++;//否则p指向右孩子
			}
		}
		ch[j++]=h[p].ch;//循环结束后h[p].ch的字符赋给ch[j++]

	}
	ch[j]='\0';
	printf("%s的解码为:",s);//输出赋值后的字符
	puts(ch);
}
/*******************************/
void main()
{
	char ch[]="abcdef",s[36]="\0";
	huffmantree t;
	huffmancode h;
	printf("\n创建哈夫曼树\n");
	creattree(t);
    getchar();
	printf("\n编码表\n");
	creatcode(t,h);
	printf("\n编码\n");
    zip(h,ch,s);
	printf("\n解码\n");
	char ss[]="11101111110000110";
	uzip(h,ss,t);
}预想结果应该是这样



<无标签>
举报
顶部