怎么样用c语言程序编码哈夫曼树?

作者&投稿:钟离栋 (若有异议请与网页底部的电邮联系)
C语言程序设计 哈夫曼树编码器~

我只对个人发送。

没分..
#include
#include

typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;

#define MAXHUFFMANCODENO 5
void Select(HuffmanTree,unsigned int,unsigned int*,unsigned int*);

int main(int argc,char*argv[])
{
unsigned int w[MAXHUFFMANCODENO]={3,6,4,8,5};
unsigned int i,m,n,c,f,s1,s2,start;
char cd[MAXHUFFMANCODENO];
HuffmanTree HT;

n=MAXHUFFMANCODENO;
m=2*n-1;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(i=1;i<=n;++i)
{
HT[i].weight =w[i-1];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(;i<=m;++i)
{
HT[i].weight =0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;

}

for(i=n+1;i<=m;++i)
{
Select(HT,i-1,&s1,&s2);

HT[s1].parent=i;HT[s2].parent=i;
HT[i].lchild=s1;HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}

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';
}
printf("w%d=%d,code=%s
",i,HT[i].weight,&cd[start]);
}
return 0;


}



void Select(HuffmanTree HT,unsigned int i1,unsigned int *s1,unsigned *s2)
{
unsigned int j,s;

s=0;

for(j=1;j<=i1;j++)
{
if(HT[j].parent==0)
{
if(s==0) s=j;
if(HT[j].weight<HT[s].weight) s=j;
}
}

*s1=s;

s=0;
for(j=1;j<=i1;j++)
{
if((HT[j].parent==0)&&(j!=*s1))
{
if(s==0) s=j;
if(HT[j].weight <HT[s].weight ) s=j;
}

}
*s2=s;
}

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <ctype.h>
#include<limits.h>
int function1(char ch,char *s)
{
int i;
for(i=0; s[i]!='\0'; i++)
{
if(ch==s[i])return 0;
}
return 1;
}
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
} HTNode,*HuffmanTree; // 动态分配数组存储赫夫曼树
typedef char **HuffmanCode; // 动态分配数组存储赫夫曼编码表
// algo6-1.cpp 求赫夫曼编码。实现算法6.12的程序

int min(HuffmanTree t,int i)
{
// 函数void select()调用
int j,flag;
unsigned int k=UINT_MAX; // 取k为不小于可能的值
for(j=1; j<=i; j++)
if(t[j].weight<k&&t[j].parent==0)
k=t[j].weight,flag=j;
t[flag].parent=1;
return flag;
}

void select(HuffmanTree t,int i,int &s1,int &s2)
{
// s1为最小的两个值中序号小的那个

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) // 算法6.12
{
// w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
int m,i,s1,s2,start;
unsigned 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].rchild=s1;
HT[i].lchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
// printf("HT[%d].lchild:%d HT[%d].rchild:%d\n",i,s2,i,s1);
}
// 从叶子到根逆向求每个字符的赫夫曼编码
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]='1';
else
cd[--start]='0';
HC[i]=(char*)malloc((n-start)*sizeof(char));
// 为第i个字符编码分配空间
strcpy(HC[i],&cd[start]); // 从cd复制编码(串)到HC
}
free(cd); // 释放工作空间
}
void swap1(int *a ,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void swap2(char *a,char *b)
{
char ch;
ch=*a;
*a=*b;
*b=ch;
}
int main(void)
{
HuffmanTree HT;
HuffmanCode HC;
char *s1,*s2;
int i,j=0,n,count,*m,t,flag=1;
scanf("%d",&n);
getchar();
s1=(char*)malloc((n+n)*sizeof(char));
s2=(char*)malloc(n*sizeof(char));
memset(s2,'\0',n*sizeof(char));
gets(s1);
count=strlen(s1);
for(i=0; i<count; i++)
{
if(!isspace(*(s1+i)))
{
if(function1(*(s1+i),s2))
{
*(s2+j)=*(s1+i);
j++;
}
}
else;
}
m=(int*)malloc(j*sizeof(int));
for(i=0; i<j; i++)
*(m+i)=0;
for(t=0; t<j; t++)
{
for(i=0; i<count; i++)
{
if(*(s2+t)==*(s1+i))
*(m+t)+=1;
}
}
for(i=0;i<j;i++)
while(flag)
{
flag = 0;
for (t=0; t<j-1; t++)
{
if(*(m+t)<*(m+t+1))
{
swap1(m+t,m+t+1);
swap2(s2+t,s2+t+1);
flag=1;
}
}
}
HuffmanCoding(HT,HC,m,j);
for(i=1,t=0; i<=j; i++,t++)
{
printf("%c %d %s\n",*(s2+t),*(m+t),HC[i]);

}
return 0;
}

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include
<ctype.h>
#include<limits.h>
int
function1(char
ch,char
*s)
{
int
i;
for(i=0;
s[i]!='\0';
i++)
{
if(ch==s[i])return
0;
}
return
1;
}
typedef
struct
{
unsigned
int
weight;
unsigned
int
parent,lchild,rchild;
}
HTNode,*HuffmanTree;
//
动态分配数组存储赫夫曼树
typedef
char
**HuffmanCode;
//
动态分配数组存储赫夫曼编码表
//
algo6-1.cpp
求赫夫曼编码。实现算法6.12的程序
int
min(HuffmanTree
t,int
i)
{
//
函数void
select()调用
int
j,flag;
unsigned
int
k=UINT_MAX;
//
取k为不小于可能的值
for(j=1;
j<=i;
j++)
if(t[j].weight<k&&t[j].parent==0)
k=t[j].weight,flag=j;
t[flag].parent=1;
return
flag;
}
void
select(HuffmanTree
t,int
i,int
&s1,int
&s2)
{
//
s1为最小的两个值中序号小的那个
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)
//
算法6.12
{
//
w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
int
m,i,s1,s2,start;
unsigned
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].rchild=s1;
HT[i].lchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
//
printf("HT[%d].lchild:%d
HT[%d].rchild:%d\n",i,s2,i,s1);
}
//
从叶子到根逆向求每个字符的赫夫曼编码
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]='1';
else
cd[--start]='0';
HC[i]=(char*)malloc((n-start)*sizeof(char));
//
为第i个字符编码分配空间
strcpy(HC[i],&cd[start]);
//
从cd复制编码(串)到HC
}
free(cd);
//
释放工作空间
}
void
swap1(int
*a
,int
*b)
{
int
t;
t=*a;
*a=*b;
*b=t;
}
void
swap2(char
*a,char
*b)
{
char
ch;
ch=*a;
*a=*b;
*b=ch;
}
int
main(void)
{
HuffmanTree
HT;
HuffmanCode
HC;
char
*s1,*s2;
int
i,j=0,n,count,*m,t,flag=1;
scanf("%d",&n);
getchar();
s1=(char*)malloc((n+n)*sizeof(char));
s2=(char*)malloc(n*sizeof(char));
memset(s2,'\0',n*sizeof(char));
gets(s1);
count=strlen(s1);
for(i=0;
i<count;
i++)
{
if(!isspace(*(s1+i)))
{
if(function1(*(s1+i),s2))
{
*(s2+j)=*(s1+i);
j++;
}
}
else;
}
m=(int*)malloc(j*sizeof(int));
for(i=0;
i<j;
i++)
*(m+i)=0;
for(t=0;
t<j;
t++)
{
for(i=0;
i<count;
i++)
{
if(*(s2+t)==*(s1+i))
*(m+t)+=1;
}
}
for(i=0;i<j;i++)
while(flag)
{
flag
=
0;
for
(t=0;
t<j-1;
t++)
{
if(*(m+t)<*(m+t+1))
{
swap1(m+t,m+t+1);
swap2(s2+t,s2+t+1);
flag=1;
}
}
}
HuffmanCoding(HT,HC,m,j);
for(i=1,t=0;
i<=j;
i++,t++)
{
printf("%c
%d
%s\n",*(s2+t),*(m+t),HC[i]);
}
return
0;
}


如何用C语言编写一个简单的程序!
电脑,c语言软件 1、鼠标左键双击c语言软件,打开,打开后界面如图,点击关闭即可 2、点击上方程序窗口左上角的文件,选择新建 3、在打开的窗口中选择文件,下边一般是第四个 c++Source file,输入文件名(hellw.c),一定要以“.c”为后缀结尾 4、进入编辑页面在,页面编辑源代码就可以 includestdio...

如何使用c语言编写程序?
1、第一首先打开c语言编辑项目软件。再创建项目。2、然后创建结构体。再设置结构体的两个数据域。3、然后创建一个函数。再创建结构体数组,添加到函数。4、然后定义三个变量i,j,sum。再用i变量进行循环。5、然后用scanf语句进行输入。再用结构体数组进行接收。6、第六然后打开指定文件。再用fwrite语...

怎么用c语言编写一个小程序?
1、首先打开DEV C++软件,点击“新建源代码”,在编辑页面输入以下代码。2、因为题目要求我们先输入一个整数,所以在定义变量时,就应该将其定义为整数型,注意,在输入,输出函数中,整数型对应的是“%d”。3、接下来就要对输入的整数进行判断,在C语言中,if是判断语句,所以用它来对整数进行判断。if...

c语言的开发步骤有哪些
C语言程序开发的六个步骤,包括问题定义、算法设计、编码、调试、测试和维护。1、问题定义 在开始编写C语言程序之前,首先需要明确问题的定义和要求。这包括确定程序的输入和输出,分析问题的特点和约束条件,理解所需实现的功能。问题定义阶段还需要对问题进行分析和设计,确定解决问题所需的算法和数据结构。

开发一个C语言程序需要经过的四个步骤是什么?
开发一个C语言程序需要经过的四个步骤:编辑、编译、连接、运行。C语言程序可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。1、预处理:输入源程序并保存(.C文件)。2、编译:将源程序翻译为目标文件(.OBJ文件)。...

如何用C语言编写一个程序?
include <stdio.h> int main(void){ float n, n2, n3;printf("请输入一个数\\n");scanf("%f",&n);printf("请再输入一个数\\n");scanf("%f",&n2);n3=n2+n;printf("这两个数的和是%.2f",n3);return 0;}

C语言编写程序的方法是什么?
C语言编写程序的方法:visual c++6.0 报错比较准确,但比较难用。是微软推出的一款编译器,是一个功能强大的可视化软件开发工具。Turbo C 2.0 是dos环境下的,比较好用,但不支持复制,粘贴等功能,比较不好用,要记住常用的几个快捷键。win-tc 窗口下的tc,比较好用,界面简洁,美观。适合编一些...

如何用c语言编写一个程序?
include<stdio.h> int main(){ int i,m=0;for(i=2;i<=100;i+=2) m=m+i;printf("%d\\n",m);return 0;} 或 include int main(){ int i,sum=0;for(i=1;i<=50;i++){ sum=sum+2*i;} printf("2+4+6+…+98+100=%d\\n",sum);return 0;} ...

C语言有哪些实用的编程方法?
能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误...

如何编写C语言程序?
2.快捷键“CTRL+N”建立新源代码。3.输入源代码,下面给出最简单的Hello,world源代码:include <stdio.h> int main( ){ printf("Hello,World\\n");return 0;} 4.按下F11编译并且运行源代码,得到运行结果:5.点击任意键返回源代码编辑界面可以继续进行开发,接下来就是C语言语法的学习了。

和静县18017077171: 怎么样用c语言程序编码哈夫曼树? -
阿贾星乐: #include<stdio.h>#include<stdlib.h>#include<string.h>#include <ctype.h>#include<limits.h> int function1(char ch,char *s) { int i; for(i=0; s[i]!='\0'; i++) { if(ch==s[i])return 0; } return 1; } typedef struct { unsigned int weight; unsigned int parent,lchild,rchild;...

和静县18017077171: 用c语言随意构建一个哈夫曼树 -
阿贾星乐: #include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#define MaxSize 10#define IS_FULL(ptr)(!(ptr)) typedef struct btnode { char code; int Element; struct btnode* LChild,*RChild; }BTNode; typedef struct btree{ struct btnode* ...

和静县18017077171: C语言编写哈夫曼树 -
阿贾星乐: // huffman.cpp : Defines the entry point for the console application. // #include#include#includeconst long wordnum = 1000;//最大不同单词数 const long code_len = wordnum/10; const long wordlen = 30;//单词最长长度 const long codemax = ...

和静县18017077171: 哈夫曼树及哈夫曼编码,c语言算法实现 -
阿贾星乐: 我电脑里保存了类似的这样的题目,可以直接运行的: #include #include #include #include #include #include #define maxsize 50 //定义huffnode及huffcode,分别用来存储节点信息及各节点编码 typedef struct { char data; //节点值 int weight; //...

和静县18017077171: 如何利用C语言建立一颗哈夫曼树,求找错
阿贾星乐: 额,LZ的代码里有比较蛋痛的地方,我说一下看看自己理解的对不对: 1.在Fmin中,LZ的思路是把最小的两个元素放在森林的0和1位置,然后处理 针对1:可以不使用k1和k2记录权重(况且写错了,应该是为*k1和*k2赋值,不但写反而且没加*...

和静县18017077171: 用C程序实现哈夫曼编码 -
阿贾星乐: 去年做的课程设计,有什么不合要求的自己改改#include<string.h>#include<stdlib.h>#include<stdio.h> int m,s1,s2; typedef struct { unsigned int weight; unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树 typedef ...

和静县18017077171: 用c语言解决数据结构哈夫曼树问题 -
阿贾星乐: #include "string.h"#include "stdio.h"#define MAXVALUE 1000 /*定义最大权值*/#define MAXLEAF 30 /*定义哈夫曼树叶结点个数*/#define MAXNODE MAXLEAF*2-1#define MAXBIT 30 /*定义哈夫曼编码的最大长度*/ typedef struct { int bit[...

和静县18017077171: 简单的Huffman霍夫曼编码.用C语言实现. -
阿贾星乐: #include<stdio.h>#include<conio.h>#include<iostream.h>#include<string.h>#include<stdlib.h>#define MAXVALUE 10000 /*权值最大值*/#define MAXLEAF 30 /*叶子最多个数*/#define MAXNODE MAXLEAF*2-1 /* 结点数的个数*/#define MAXBIT...

和静县18017077171: 用c程序实现霍夫曼编码 -
阿贾星乐: 这是我当时做的作业题,就是数据结构书上的那道题.不知道是否和你说的是同样一道题,代码如下:/*HuffmanCode BY Turbo C 2.0Filename: Huffman.cAuthor: dcyu.Ver 1.00*/#include #include #include #include #include typedef ...

和静县18017077171: Huffman编码C语言实现 -
阿贾星乐: 说明:本程序是依据严蔚敏的数据结构(C语言版)上的代码实现的.#pragmaonce#include<stdio.h>#include<tchar.h>#include<stdlib.h>#define MAX 100 typedefstruct{ //节点 int weight; int parent, lchild, rchild; }HTNode, *HuffmanTree; ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网