• 大小: 104KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-10
  • 语言: 其他
  • 标签:

资源简介

这是我自己写的哈夫曼编码译码器的代码和报告,有需要和兴趣的可以看看,属于初学数据结构的人的材料,资深写程序的可以忽略。

资源截图

代码片段和文件信息

#include  
#include  
#include 
#include 
 
typedef int TElemType; 
using namespace std;
typedef struct 

int weight; 
    int parentlchildrchild; 
}HTNode* HuffmanTree; 

typedef char **HuffmanCode;//定义Huffman编码表 

//-----------全局变量----------------------- 
HuffmanTree HT; 
HuffmanCode HC; 
int w[50]ijn; 
char z[50];  //字符数组 
int flag=0; 
int numb=0; 
//-----------------select函数---------------------------
void select(HuffmanTree tint iint &s1int &s2) 
{ // t[1..i]中权值最小的俩结点的序号为s1,s2 
      int j=1max=1000;
  for(j=1;j<=i;j++)//寻找parent为0的节点,并将器parent赋为1
  {
  if(t[j].parent==0&&t[j].weight   {
  s1=j;
  max=t[j].weight;
  }
  } 
  t[s1].parent=1;
  max=1000;
  for(j=1;j<=i;j++)
  {
  if(t[j].parent==0&&t[j].weight          {
  s2=j;
              max=t[j].weight;
  }
  }
}
// --------------算法6.12-------------------------- 
void HuffmanCoding(HuffmanTree &HTHuffmanCode &HCint *wint n) 
{ // w存放n个字符的权值(均>0)构造赫夫曼树HT并求出n个字符的赫夫曼编码HC 
int mis1s2start; int cf; 
    HuffmanTree p;  char *cd;

    if(n<=1)  return;//检测结点数是否可以构成树 
    m=2*n-1; 
    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用 
    for(p=HT+1i=1;i<=n;++i++p++w) //HT[1..n]结点有权值
    { 
p->weight=*w;  p->parent=0; 
p->lchild=0;   p->rchild=0; 

    for(;i<=m;++i++p) //HT[n+1...m]结点权值为0

p->weight=0;  p->parent=0; 
p->lchild=0;   p->rchild=0; 

for(i=n+1;i<=m;++i) // 建赫夫曼树 
{ // 在HT[1~i-1]中选择parent为0且weight最小的两个结点其序号分别为s1和s2 
select(HTi-1s1s2); 
        HT[s1].parent=HT[s2].parent=i; 
        HT[i].lchild=s1; 
        HT[i].rchild=s2; 
        HT[i].weight=HT[s1].weight+HT[s2].weight; 
    } 
    // -------------从叶子到根逆向求每个字符的赫夫曼编码 --------------
    HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); // 分配n个字符编码的头指针向量([0]不用) 
    cd=(char*)malloc(n*sizeof(char)); // 分配求编码的工作空间 
    cd[n-1]=‘e‘; // 编码结束符 
    for(i=1;i<=n;i++) 
    { // 逐个字符求赫夫曼编码 
start=n;//-1; // 编码结束符位置 
for(c=if=HT[i].parent;f!=0;c=ff=HT[f].parent) 
{ // 从叶子到根逆向求编码 
if(HT[f].lchild==c) 
cd[--start]=‘0‘; 
else 
cd[--start]=‘1‘; 
}
     HC[i]=(char*)malloc((n-start)*sizeof(char)); // 为第i个字符编码分配空间 
     strcpy(HC[i]&cd[start]); // 从cd复制编码(串)到HC 
     } 
     free(cd); // 释放工作空间 

//--------------初始化赫夫曼链表--------------------------------- 
void Initialization() 

char s[10];
cout<<“请输入字符集字符个数“;
cin>>n;
cout<<“请输入字符集及其权值:“;
cin.getline(s1);
cin.getline(z30);
for(i=0;i {
   cin>>*(w+i);    
}
    HuffmanCoding(HTHCwn);

    //------------------------打印编码------------------------------------------- 
    cout<<“字符对应的编码为:“<    for(i=1;i<=n;i++) 
    { 
        cout<<*(z+i-1)<<‘ ‘; 
puts(HC[i]); //把p指向的字符串输出到终端 
    } 
    //--------------------------将赫夫曼编码写入文件------------------------ 
    cout<<“下面将赫夫曼编码写入文件“<

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       8359  2010-11-30 18:39  哈夫曼编码译码器\03082051李丽清exp3哈夫曼编码译码器.cpp

     文件     130048  2010-11-30 18:53  哈夫曼编码译码器\03082051李丽清exp3哈夫曼编码译码器.doc

     文件        109  2010-11-30 13:24  哈夫曼编码译码器\codefile.txt

     文件        109  2010-11-30 13:24  哈夫曼编码译码器\CodePrin.txt

     文件         98  2010-11-30 13:05  哈夫曼编码译码器\htmTree.txt

     文件       3180  2011-05-14 17:16  哈夫曼编码译码器\huffman.cpp

     文件         28  2010-11-30 13:24  哈夫曼编码译码器\tobetran.txt

     文件        790  2010-11-30 13:25  哈夫曼编码译码器\TreePrint.txt

     文件         28  2010-11-30 13:24  哈夫曼编码译码器\txtfile.txt

     目录          0  2011-05-14 17:18  哈夫曼编码译码器

----------- ---------  ---------- -----  ----

               142749                    10


评论

共有 条评论

相关资源