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

今天迈出了一小步
译码部分有bug!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int lettersize=15;
struct Huffman{
	char c;
	int w;
	int lchild,rchild,parent;//序号表示 
}C[30];
int min=100,sub=200;//最小值和次小值 
int sin[15][8],sout[15][8];//存放双亲节点权值及编码 
int	length[15];//存放编码长度 
void Structure()
{
	printf("存储结构图\n");
	printf("次序cur weight parent lchild rchild\n");
	for(int i=0;i<29;i++)
		printf("%d\t %d\t %d\t %d\t %d\t\n",i,C[i].w,C[i].parent,C[i].lchild,C[i].rchild);	
	printf("\n");
}
void Init()
{
	int i;
	char str[lettersize]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'};
	int s[lettersize]={64,13,22,32,80,21,15,47,57,1,5,32,20,57,63};
	for(i=0;i<2*lettersize-1;i++)
	{
		C[i].c=0;
		C[i].w=0;	
		C[i].lchild=0;
		C[i].parent=0;
		C[i].rchild=0;
	}
	for(i=lettersize;i<2*lettersize-1;i++)
		C[i].w=1000;
	for(int i=0;i<lettersize;i++)
	{
		C[i].c=str[i];
		C[i].w=s[i];
	}
}
void Build()
{
	int i,j=0,l=0,r=0;
	for(int k=0;k<14;k++)
	{
		for(i=0;i<29;i++)
		{
			if(C[i].parent==0)
			{
				if(min>C[i].w)
				{
					min=C[i].w;
					l=i;
				}
			}
		}
		C[lettersize].lchild=l;
		C[l].parent=lettersize;	
		for(j=0;j<29;j++)
		{	
			if(C[j].parent==0)
			{
				if(sub>C[j].w)
				{
					sub=C[j].w;
					r=j;
				}
			}
		}
		C[lettersize].rchild=r;
		C[r].parent=lettersize;
		C[lettersize].w=min+sub;
		min=1000;
		sub=1000;
		lettersize++;
	}
	Structure();
}
void Print()
{
	int num=0,i=0,j=0,k=0,number=0;
	for(int x=0;x<15;x++)
	{
		num=0;j=0;
		k=x;
		sin[i][num]=C[k].w;
		num++;
		while(C[k].parent!=0)
		{
			sin[i][num]=C[C[k].parent].w;//双亲的权 
			k=C[k].parent;//查找双亲结点  
			num++;
		}
		num-=2;
		number=num;
		while(num>=0)
		{
			if(C[C[k].lchild].w==sin[i][num])
			{
				sout[i][j]=0;
				k=C[k].lchild;
				num--;
				j++;
				continue;
			}
			if(C[C[k].rchild].w==sin[i][num])
			{
				sout[i][j]=1;
				k=C[k].rchild;
				num--;
				j++;
				continue;
			}
		}
		i++;
		printf("%c:",C[x].c);
		for(int y=0;y<number+1;y++)
		{
			length[x]=number+1;
			printf("%d",sout[x][y]);
		}
		printf("\n");
	}
	printf("\n");
}
void Code()
{
	char d;
	int ascii=0,len,x;
	char st[20];
	printf("请输入报文长度(x<20)\n");
	scanf("%d",&len);
	getchar(); 
	printf("请输入报文(a~o)\n");
	for(x=0;x<len;x++)
	{
		scanf("%c",&st[x]);
		d=st[x];
		ascii=(int)d;
		for(int y=0;y<length[ascii-97];y++)
			printf("%d",sout[ascii-97][y]);
	}
	printf("\n");
	printf("\n");
}
void Decode()
{
	int l=0,i,k=0,j=0;
	char cout[10];
	int t[50];
	printf("请输入译码长度(l<100)\n");
	scanf("%d", &l);
	printf("请输入译文编码\n");
	for(int p = 0;p < l;p++)//l为译码长度 k为循环变量 
		scanf("%d", &t[p]);
	while(k<=l)
	{
		i=28;
		while(C[i].lchild!=0&&C[i].rchild!=0)
		{
			if(t[k]==0) 
			{
				i=C[i].lchild;
				k++;
				continue;	
			}
			if(t[k]==1)
			{
				i=C[i].rchild;
				k++;
				continue;	
			}
		}
		if(C[i].lchild==0&&C[i].rchild==0)
		{
			cout[j]=C[i].c;
			j++;
			if(k==l)
				break;
		}
	}
	if(k>l)
	{
		printf("ERROR!\n");
		exit(-1);
	}	
	for(int z=0;z<j;z++)
		printf("%c",cout[z]);
}
int main()
{
	Init();
	Build();
	Print();
	Code();
	Decode();
	return 0;
}
发布了17 篇原创文章 · 获赞 0 · 访问量 1424

猜你喜欢

转载自blog.csdn.net/weixin_43511030/article/details/94663198
今日推荐