CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

哈夫曼树创建过程中的疑惑!

楼主soft_2006()2006-06-04 20:12:04 在 C/C++ / C语言 提问

下面的程序当我输入完创建数据后程序自动退出,不输出创建后的数据啊,程序的后面是输入数据范例,那位师傅帮我看看怎么回事,不应该啊  
   
  #include   <stdio.h>                       /*   输入任何一个字符查找其哈夫曼编码   */  
  #include   <stdlib.h>  
  #include   <conio.h>  
  #include   <limits.h>                     /*   数据的使用范围   */  
   
  typedef   struct  
  {  
          char   data;                                                     /*   字符   */  
          int   frequency;                                             /*   字符频率   */  
          int   parent,   lchild,   rchild;                   /*   分别代表双亲,左右孩子   */  
  }Huffman;  
   
  static   void   Malloc(Huffman   **T,   int   N);                 /*   动态内存分配   */  
  static   void   Initial(Huffman   T[],   int   N);               /*   初始化树结构   */  
  static   void   Input(Huffman   T[],   int   N);                   /*   输入树中数据   */  
  static   void   Create(Huffman   T[],   int   N);                 /*   创建哈夫曼树   */  
  static   void   Select(Huffman   T[],   int   i,   int   *p1,   int   *p2);               /*   查找两个最小者   */  
  static   void   Output(Huffman   T[],   int   N);                 /*   输出哈夫曼树   */  
   
  int   main(void)  
  {  
          Huffman   *T   =   NULL;  
          int   N;                                     /*   N代表动态内存分配的数量   */  
           
          printf("Enter   N:   ");  
          scanf("%d",   &N);                       /*   N代表字符个数   */  
           
          Malloc(&T,   N);                           /*   传递地址   */  
           
          Initial(T,   N);                           /*   初始化树   */  
           
          Input(T,   N);                               /*   输入树中数据   */  
           
          Create(T,   N);                             /*   创建哈夫曼树   */  
           
          Output(T,   N);                             /*   输出数据   */  
   
          return   0;  
  }  
   
  static   void   Malloc(Huffman   **T,   int   N)           /*   动态分配内存   */  
  {  
          if   (((*T)   =   (Huffman*)malloc(sizeof(Huffman)   *   N))   ==   NULL)  
          {  
                  printf("memory   malloc   failure,   press   any   key   quit.\n");  
                  getch();  
                  exit(1);  
          }  
  }  
   
  static   void   Initial(Huffman   T[],   int   N)       /*   初始化   */  
  {  
          int   i;  
           
          for   (i   =   0;   i   <   2   *   N   -   1;   i++)  
          {  
                  T[i].parent   =   T[i].lchild   =   T[i].rchild   =   -1;  
          }  
  }  
   
  static   void   Input(Huffman   T[],   int   N)       /*   输入数据   */  
  {  
          int   i;  
           
          printf("Enter   every   data:   ");  
          for   (i   =   0;   i   <   N;   i++)  
          {  
                  scanf("%c",   &T[i].data);     /*   读取字符   */  
          }  
           
          printf("Enter   every   character   frequency:   ");  
          fflush(stdin);  
          for   (i   =   0;   i   <   N;   i++)  
          {  
                  scanf("%d",   &T[i].frequency);                 /*   读取每个字符出现的频率   */  
          }  
  }  
   
   
  static   void   Create(Huffman   T[],   int   N)         /*   创建哈夫曼树   */  
  {  
          int   i,   p1,   p2;       /*   p1,   p2分别代表最小者和次小者   */  
           
          for   (i   =   N;   i   <   2   *   N   -   1;   i++)  
          {  
                  Select(T,   i,   &p1,   &p2);                   /*   查找两个字符出现频率最小者   */  
   
                  T[i].lchild   =   p1;  
                  T[i].rchild   =   p2;  
                  T[p1].parent   =   T[p2].parent   =   i;  
                  T[i].frequency   =   T[p1].frequency   +   T[p2].frequency;  
          }  
           
  }  
   
  static   void   Select(Huffman   T[],   int   i,   int   *p1,   int   *p2)  
  {  
          int   j,   pos,   min;                     /*   初始化最小者   */  
           
          for   (j   =   0,   min   =   INT_MAX;   j   <   i;   j++)           /*   找最小者   */  
          {  
                  if   (T[j].frequency   <   min   &&   T[j].parent   ==   -1)  
                  {  
                          min   =   T[j].frequency;  
                          *p1   =   i;                             /*   保存最小者下标   */  
                  }  
          }  
          T[*p1].parent   =   -2;  
           
          for   (j   =   0,   min   =   INT_MAX;   j   <   i;   j++)     /*   查找次小者   */  
          {  
                  if   (T[j].frequency   <   min   &&   T[j].parent   ==   -1)  
                  {  
                          min   =   T[j].frequency;  
                          *p1   =   i;  
                  }  
          }  
          T[*p2].parent   =   -2;  
  }  
   
  static   void   Output(Huffman   T[],   int   N)  
  {  
          int   i;  
           
          for   (i   =   0;   i   <   N;   i++)                   /*   输出字符   */  
          {  
                  printf("%c   ",   T[i].data);  
          }  
          printf("\n");  
           
          for   (i   =   0;   i   <   2   *   N   -   1;   i++)  
          {  
                  printf("%d   ",   T[i].frequency);                     /*   输出频率   */  
          }  
          printf("\n");  
  }  
   
  #if   0  
  Enter   N:   7  
  Enter   every   data:   abcdefg  
  Enter   every   character   frequency:   5   6   11   15   18   26   34  
  Press   any   key   to   continue...  
  #endif  
   
   
           
           
           
           
           
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  问题点数:20、回复次数:2Top

1 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-04 20:21:28 得分 20

写的还是不错的...  
    自己一行一行的调试吧!!Top

2 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-04 20:28:16 得分 0

我前几天赶作业,也写了一个huffman   code   and   encode...  
  在调试的过程中碰到了很多困难...  
   
  我就从程序头到程序尾一遍一遍的用cout输出信息(注:c中用printf)。哪个地方出错了,就专门看前面一部分...虽然花了很长的一段时间,但是很有收获的!Top

相关问题

关键词

得分解答快速导航

  • 帖主:soft_2006
  • chenhu_doc

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo