首页 新闻 会员 周边 捐助

求大神。 小白一只。(实现不了功能。) 现在大二都快结束了。感觉自己都没掌握什么知识。求指导。

0
悬赏园豆:20 [待解决问题]

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define maxsize 100  /* 编码函数中,被编译的字符串的最大长度 */
#define max 100  /* 最大字符的个数 */
typedef struct  /* 定义一个HUFFNODE结点 */
{
  char data;    /* 数据域 */
  int weight;   /* 权值域 */
  int parent;   /* 双亲域 */
  int left;     /* 左孩子域 */
  int right;    /* 右孩子域 */
}huffnode;
typedef struct  /* 定义一个HUFFCODE结点 */
{
   char cd[max];  /* 数组cd存放哈夫曼编码 */
   int start;
}huffcode;

huffnode *init()    /* 初始化带权结点 */
{
  huffnode ht[2*max];
  ht[0].weight=27;
  ht[1].data=' '; ht[1].weight=186;
  ht[2].data='A'; ht[2].weight=64;
  ht[3].data='B'; ht[3].weight=23;
  ht[4].data='C'; ht[4].weight=22;
  ht[5].data='D'; ht[5].weight=32;
  ht[6].data='E'; ht[6].weight=103;
  ht[7].data='F'; ht[7].weight=21;
  ht[8].data='G'; ht[8].weight=15;
  ht[9].data='H'; ht[9].weight=47;
  ht[10].data='I'; ht[10].weight=57;
  ht[11].data='J'; ht[11].weight=1;
  ht[12].data='K'; ht[12].weight=5;
  ht[13].data='L'; ht[13].weight=32;
  ht[14].data='M'; ht[14].weight=20;
  ht[15].data='N'; ht[15].weight=20;
  ht[16].data='O'; ht[16].weight=56;
  ht[17].data='P'; ht[17].weight=19;
  ht[18].data='Q'; ht[18].weight=2;
  ht[19].data='R'; ht[19].weight=50;
  ht[20].data='S'; ht[20].weight=51;
  ht[21].data='T'; ht[21].weight=55;
  ht[22].data='U'; ht[22].weight=30;
  ht[23].data='V'; ht[23].weight=10;
  ht[24].data='W'; ht[24].weight=11;
  ht[25].data='X'; ht[25].weight=2;
  ht[26].data='Y'; ht[26].weight=21;
  ht[27].data='Z'; ht[27].weight=2;
  return ht;
}
void hfmtree(huffnode ht[])  /* 创建一棵哈夫曼树 */
{
  int i,k,x1,x2,n,m1,m2;  /* m1为最小权值,x1为其在ht中的下标;m2为第二小权值,x2为其下标 */
  n=ht[0].weight;
  for(i=1;i<=2*n-1;i++)
    ht[i].parent=ht[i].left=ht[i].right=0;  /* 对ht的parent,left,right域进行初始化 */
  for(i=n+1;i<=2*n-1;i++)
  {
     m1=m2=10000;  /* m1,m2初值无限大 */
     x1=x2=0;      /* x1, x2初值为0 */
     for(k=1;k<=i-1;k++)  /* k为可以进行比较的结点的下标 */
       if(ht[k].parent==0)     /* 当前结点的父结点不存在时 */
  if(ht[k].weight<m1)   /* 当前结点的权值比最小权值还小时 */
  {
    m2=m1;
    x2=x1;
    m1=ht[k].weight;
    x1=k;
  }
       else if(ht[k].weight<m2)    /* 当前结点的权值比最小权值大但比第二最小权值小时 */
     {
       m2=ht[k].weight;
       x2=k;
     }
     ht[x1].parent=i;
     ht[x2].parent=i;
     ht[i].weight=ht[x1].weight+ht[x2].weight;
     ht[i].left=x1;
     ht[i].right=x2;
  }
}
huffcode *output(huffnode ht[])  /* 输出哈夫曼编码 */
{
  huffcode hcd[max],d;
  int i,n,c,f,k,x;
  n=ht[0].weight;
  for(i=1;i<=n;i++)
  {
    d.start=n+1; /* d.start为栈顶 */
    c=i;   /* c存放当前结点 */
    f=ht[i].parent;   /* f存放当前结点的父结点 */
    while(f!=0)
    {
      if(ht[f].left==c)  /* 若当前结点在其父结点的左边时 */
 d.cd[--d.start]='0';
      else
 d.cd[--d.start]='1'; /* 当前结点在其父结点的右边时 */
      c=f;   /*  当前结点的父结点赋予c */
      f=ht[f].parent;  /* c的父结点赋予f */
    }
    hcd[i]=d;  /* 将当前结点的哈夫曼编码赋予hcd[i]数组 */
  }
  printf("input huf]fman code:\n");
  for(i=1;i<=n;i++)  /* 输出各个结点的哈夫曼编码 */
  {
    printf("%c: ",ht[i].data);
    x=hcd[i].start;
    for(k=x;k<=n;k++)  /* 通过栈输出哈夫曼编码 */
      printf("%c",hcd[i].cd[k]);
    printf("\n");
  }
  return hcd;
}
void coding(huffcode hcd[],huffnode ht[]) /* 编码函数,给定一个字符串,输出其对应的哈夫曼编码 */
{
  int i,j,n,m,k,x;
  char in[maxsize],out[2*maxsize]; /* in存放需编译的字符串,out存放编译后的代码 */
  m=0; /* m为out数组的下标 */
  printf("enter a string:");
  getchar();
  gets(in);
  n=strlen(in);
  for(i=0;i<n;i++)
  {
    for(j=1;j<=ht[0].weight;j++)  /* ht[0].weight存放的是带权结点的个数 */
      if(in[i]==ht[j].data)  /* 若输入字符和一个带权结点相同 */
 {
          x=hcd[j].start;
   for(k=x;k<=ht[0].weight;k++)
    out[m++]=hcd[j].cd[k];
 }
  }
  printf("the coding result is:\n");
  for(i=0;i<m;i++)
   printf("%c",out[i]);
  printf("\n");
}
void decoding(huffcode hcd[],huffnode ht[]) /* 译码函数,输入一个代码流,输出其对应的字符 */
{
  int i,j,n,k,x,m,w;
  char in[maxsize*2],out[maxsize];  /* in数组存放代码流,out数组存放对应字母 */
  printf("enter code stream:\n");
  scanf("%s",in);
  n=strlen(in);
  i=0; m=0;   /* i为in数组的下标,m为out数组的下标 */
  while(i<n)
  {
    for(j=1;j<=ht[0].weight;j++)  /* ht[0].weight为带权结点的个数 */
      {
        x=hcd[j].start;
        for(k=x,w=i;k<=ht[0].weight;k++,w++)   /* k为hcd[j].cd[]的下标 */
          if(in[w]!=hcd[j].cd[k])
             break;
 if(k>ht[0].weight)
          {
             out[m++]=ht[j].data;
      break;
          }
      }
    i=w;
  }
  for(i=0;i<m;i++)       /* 输出结果 */
    printf("%c",out[i]);
  printf("\n");
}
 
 void main()
{
  int select;
huffnode *ht;
huffcode *hcd;
  ht=init();
  hfmtree(ht);
  hcd=output(ht);
  do
  {
    printf("***********\n");
    printf("0. exit\n");
    printf("1. coding\n");
    printf("2. decoding\n");
    printf("enter(0---2): ");
    scanf("%d",&select);
    if(select==0)
      {
 printf("THANK YOU USE THE SOFTWARE!\n");
 exit(1);
      }
    if(select==1) coding(hcd,ht);
    else if(select==2) decoding(hcd,ht);
  }while(1);
}

盲的主页 | 初学一级 | 园豆:182
提问于:2012-06-19 12:06
< >
分享
所有回答(2)
0

等你用到时,你就有感觉了

一滴血 | 园豆:1602 (小虾三级) | 2012-06-19 14:31

哈哈

支持(0) 反对(0) | 园豆:182 (初学一级) | 2015-06-11 20:06
0

不知道你想表达什么, 翻译源代码? 不是已经有注释了么。。  学习得靠自己。 

问天何必 | 园豆:3311 (老鸟四级) | 2012-06-20 13:31

恩,

支持(0) 反对(0) | 园豆:182 (初学一级) | 2015-06-11 20:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册