西安电子科技大学信息论与编码作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

#include

#include

//typedef int TElemType;

const int UINT_MAX=1000;

char str[50];

typedef struct

{

int weight,K;

int parent,lchild,rchild;

}HTNode,* HuffmanTree;

typedef char **HuffmanCode;

//-----------全局变量-----------------------

HuffmanTree HT;

HuffmanCode HC;

int w[50],i,j,n;

char z[50];

int flag=0;

int numb=0;

// -----------------求哈夫曼编码-----------------------

struct cou{

char data;

int count;

}cou[50];

int min(HuffmanTree t,int i)

{ // 函数void select()调用

int j,flag;

int k=UINT_MAX; // 取k为不小于可能的值,即k为最大的权值1000 for(j=1;j<=i;j++)

if(t[j].weight

k=t[j].weight,flag=j;

t[flag].parent=1;

return flag;

}

//--------------------slect函数----------------------

void select(HuffmanTree t,int i,int &s1,int &s2)

{ // s1为最小的两个值中序号小的那个

int j;

s1=min(t,i);

s2=min(t,i);

if(s1>s2)

j=s1;

s1=s2;

s2=j;

}

}

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) { // w存放n个字符的权值(均>0),构造哈夫曼树HT,并求出n个字符的哈夫曼编码HC

int m,i,s1,s2,start;

//unsigned c,f;

int c,f;

HuffmanTree p;

char *cd;

if(n<=1)

return;//检测结点数是否可以构成树

m=2*n-1;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用 for(p=HT+1,i=1;i<=n;++i,++p,++w)

{

p->weight=*w;

p->parent=0;

p->lchild=0;

p->rchild=0;

}

for(;i<=m;++i,++p)

p->parent=0;

for(i=n+1;i<=m;++i) // 建哈夫曼树

{ // 在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2

select(HT,i-1,s1,s2);

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]='\0'; // 编码结束符

for(i=1;i<=n;i++)

{ // 逐个字符求哈夫曼编码

start=n-1; // 编码结束符位置

for(c=i,f=HT[i].parent;f!=0;c=f,f=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); // 释放工作空间

}

//--------------------- 获取报文并写入文件---------------------------------

int InputCode()

{

//cout<<"请输入你想要编码的字符"<

FILE *tobetran;

if((tobetran=fopen("tobetran.txt","w"))==NULL)

{

cout<<"不能打开文件"<

return 0;

}

cout<<"请输入你想要编码的字符"<

gets(str);

fputs(str,tobetran);

cout<<"获取报文成功"<

fclose(tobetran);

return strlen(str);

}

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

{ int a,k,flag,len;

a=0;

len=InputCode();

for(i=0;i

{k=0;flag=1;

cou[i-a].data=str[i];

cou[i-a].count=1;

while(i>k)

{

if(str[i]==str[k])

{

相关文档
最新文档