[数据结构]第五次作业:huffman编码及其译码(一)

/* ==============  Program Description  ============= */
/*               Freshare's 5th of dswork             */
/* ================================================== */

#include"stdio.h"
#include"string.h"
#define MAX 99
char cha[MAX];
char hc[MAX-1][MAX];
int s1,s2; //设置全局变量,以便在方法(函数)select中返回两个变量

typedef struct  //huffman树存储结构
{
 unsigned int weight;
 int lchild,rchild,parent;
}huftree;

void select(huftree tree[],int k)  //找寻parent为0,权最小的两个节点
{
  int i;
  for (i=1;i<=k && tree[i].parent!=0 ;i++); s1=i;
  for (i=1;i<=k;i++)
    if (tree[i].parent==0 && tree[i].weight<tree[s1].weight) s1=i;
  for (i=1; i<=k ; i++)
    if (tree[i].parent==0 && i!=s1) break; s2=i;
  for (i=1;i<=k;i++)
    if ( tree[i].parent==0 && i!=s1 && tree[i].weight<tree[s2].weight) s2=i;
}

void huffman(huftree tree[],int *w,int n)  //生成huffman树
{  int m,i;
   if (n<=1) return;
   m=2*n-1;
  for (i=1;i<=n;i++)
   { tree[i].weight=w[i]; tree[i].parent=0;
     tree[i].lchild=0;    tree[i].rchild=0; }
  for (i=n+1;i<=m;i++)
   { tree[i].weight=0;   tree[i].parent=0;
     tree[i].lchild=0;   tree[i].rchild=0; }
   for (i=n+1;i<=m;i++)
   {  select(tree, i-1);
         tree[s1].parent=i;
         tree[s2].parent=i;
         tree[i].lchild=s1;
         tree[i].rchild=s2;    
         tree[i].weight =tree[s1]. weight+ tree[s2].weight;
      }
}

void huffmancode(huftree tree[],char code[],int n)
{
 int start,c,i,f;
 code[n-1]='/0';
 printf("Huffman Code:/n");
 for(i=1;i<=n;i++)
 {start=n-1;
 for(c=i,f=tree[i].parent;f!=0;c=f,f=tree[f].parent)
 {if(tree[f].lchild==c)code[--start]='0';
 else code[--start]='1';}
 strcpy(hc[i],&code[start]);
 printf("%c-->%s/n",cha[i],hc[i]);
 }
}


void tohuffmancode(int n)
{
   int i=0,j;
   char anychar[9999];
   printf("Please enter a word:/n>>> ");
   scanf("%s",&anychar);
   printf("Huffman Code:");
   for (;anychar[i]!='/0';i++)
   {
      j=0;
      for(;anychar[i]!=cha[j]&&j<=n;) j++;
   if (j<=n)  printf("%s",hc[j]);
   }
   printf("/n");getchar();
}

void decode(char ch[],huftree tree[],int n)
{
 int i,j,m;char b;
 m=2*n-1;
 i=m;
 printf("please enter the code:/n>>> ");
 scanf("%c",&b);
 printf("Decode:");
 while(b!=10)   //遇到回车时,结束
 {
  
  if(b=='0')i=tree[i].lchild;
  else i=tree[i].rchild;
  if(tree[i].lchild==0)
  {printf("%c",ch[i]);
   j=i,i=m;
  }
  scanf("%c",&b);
 }
 if(tree[j].lchild!=0)
  printf("/nERROR/n");
 printf("/n/n");
}

void main()
{
 int i=0,n=0;
 int *w,weight[MAX];
 char code[MAX],ch;
 huftree tree[MAX];
 w=weight;
 printf("Please enter n:");
    scanf("%d",&n); getchar();
 printf("Please enter character and  weight( eg: a2 ):/n");
 for(i=1;i<=n;i++)
 {
  printf(">>> ");
  scanf("%c%d",&cha[i],&weight[i]);getchar();
 }
 huffman(tree,w,n);   //生成huffman树
 huffmancode(tree,code,n);  //编码A
 tohuffmancode(n);  //编码B
 decode(cha,tree,n);           //译码
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值