哈夫曼树编码实验报告

一:数据结构 c语言版 哈弗曼树 实验

#include#include#include#include using namespace std;typedef struct {//定义哈夫曼树个结点 int weight;//权值int parent,lchild,rchild;//双亲,左右孩子结点下标char data;//储存相关的字符信息}HTNode,*HuffmanTree;//动态分配数组存储哈夫曼编码树typedef char **HuffmanCode;// 动态分配数组存储哈夫曼编码表void statistics(char *a,int *w,char *d,int &n)//统计字符{int j=0;int k;for(int i=0;i<100&&a[i]!='\0';i++){for( k=0;kdata=d[i-1];p->lchild=p->parent=p->rchild=0;p->weight=w[i-1];}for(;i<=m;++i,++p) {p->lchild=p->parent=p->rchild=0;p->weight=0;}for(i=n+1;i<=m;++i){//建立哈夫曼树int s1,s2,u,t;for (u=1;u<=i-1;u++)if(HT[u].parent==0){s1=u;break;}for(u=u+1;u<=i-1;u++){if(HT[s1].weight>HT[u].weight&&HT[u].parent==0)s1=u;}for(t=1;t<=i-1;t++)if(HT[t].parent==0&&t!=s1){s2=t;break;}for(t=t+1;t<=i-1;t++){if(HT[s2].weight>HT[t].weight&&HT[t].parent==0&&t!=s1)s2=t;}HT[s1].parent=i;HT[s2]......余下全文>>

二:求高手完成Huffman编码/解码实验的实验报告

偶的空间有现成的,改改就是了~

三:求高手们二叉树实验报告 注意是“数据结构C++版”的

哥 你不给分 >?

四:我们有个数据结构的哈夫曼编码解码的课程设计,你能帮帮我吗

树和哈夫曼树实验报告

一.实验目的

练习树和哈夫曼树的有关操作,和各个算法程序,理解哈夫曼树的编码和译码

二.实验环境

Microsoft visual c++

三.实验问题描述

1. 问题描述:建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。

基本要求:从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立),并将此二叉树按照“树状形式”打印输出,然后对其进行遍历(先序、中序和后序),最后将遍历结果打印输出。在遍历算法中要求至少有一种遍历采用非递归方法。

测试数据:

ABCØØDEØGØØFØØØ(其中Ø表示空格字符)

输出结果为:

先序:ABCDEGF

先序:CBEGDFA

先序:CGEFDBA

2. 问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接受端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。

基本要求:(至少完成功能1-2)

一个完整的系统应具有以下功能:

I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。

基本要求:

E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

D:译码(Decoding )。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。

P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrint中。

T:印哈夫曼树(TreePrinting)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

测试数据:

设权值w=(5,29,7,8,14,23,3,11),n=8。

按照字符‘0’或‘1’确定找左孩子或右孩子,则权值对应的编码为:

5:0001,29:11,7:1110,8:1111

14:110,23:01,3:0000,11:001

用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。

四.实验主要程序流

实验题目一主要程序:

1.

void CreatBiTree(BitTree *bt)//用扩展先序遍历序列创建二叉树,如果是#当前树根置为空,否则申请一个新节点//

{

char ch;

ch=getchar();

if(ch=='.')*bt=NULL;

else

{

*bt=(BitTree)malloc(sizeof(BitNode));

(*bt)->data=ch;

CreatBiTree(&((*bt)->LChild));

CreatBiTree(&((*bt)->......余下全文>>

五:一、实验题目:用哈夫曼编码实现文件压缩用C++实现 急用

这是我的实验报告:student.csdn.net/...51206/**

* @brief 哈夫曼编码

* @date 2010-11-30

*/

#include

#include

#include

#include

using namespace std;

/**

* @brief 哈弗曼结点

* 记录了哈弗曼树结点的数据、权重及左右儿子

*/

struct HTNode {

char data;

HTNode *lc, *rc;

int w;

/** 节点构造函数 */

HTNode(char _d, int _w, HTNode *_l = NULL, HTNode *_r = NULL)

{

data = _d;

w = _w;

lc = _l;

rc = _r;

}

/** 节点拷贝构造函数 */

HTNode(const HTNode &h)

{

data = h.data;

lc = h.lc;

rc = h.rc;

w = h.w;

}

/** 用于优先队列比较的运算符重载 */

friend bool operator < (const HTNode &a, const HTNode &b)

{

return a.w > b.w;

}

};

/** 哈弗曼树叶子节点数、各叶子结点数据及权重 */

/** 权值从Lolita小说中抽样取出 */

const char ch[] = {

10, 32, 33, 37, 40, 41, 44, 45, 46, 48,

49, 50, 51, 52, 53, 54, 55, 56, 57, 58,

59, 63, 65, 66, 67, 68, 69, 70, 71, 72,

73, 74, 75, 76, 77, 78, 79, 80, 81, 82,

83, 84, 85, 86, 87, 88, 89, 90, 91, 93,

97, 98, 99, 100, 101, 102, 103, 104, 105, 106,

107, 108, ......余下全文>>

六:一、实验题目:用哈夫曼编码实现文件压缩用C++实现

这是我的实验报告: student.csdn.net/...=51206 /** * @brief 哈夫曼编码 * @date 2010-11-30 */ #include #include #include #include using namespace std; /** * @brief 哈弗曼结点 * 记录了哈弗曼树结点的数据、权重及左右儿子 */ struct HTNode { char data; HTNode *lc, *rc; int w; /** 节点构造函数 */ HTNode(char _d, int _w, HTNode *_l = NULL, HTNode *_r = NULL) { data = _d; w = _w; lc = _l; rc = _r; } /** 节点拷贝构造函数 */ HTNode(const HTNode &h) { data = h.data; lc = h.lc; rc = h.rc; w = h.w; } /** 用于优先队列比较的运算符重载 */ friend bool operator < (const HTNode &a, const HTNode &b) { return a.w > b.w; } }; /** 哈弗曼树叶子节点数、各叶子结点数据及权重 */ /** 权值从Lolita小说中抽样取出 */ const char ch[] = { 10, 32, 33, 37, 40, 41, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 63, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 93, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 161, 164, 166, 168, 170, 173, 174, 175, 176, 177, 180, 186, 255, '\r', '\0' }; const int fnum[] = { 2970, 99537, 265, 1, 496, 494, 9032, 1185, 5064, 108, 180, 132, 99, 105, 82, 64, 62, 77, 126, 296, 556, 548, 81......余下全文>>

七:求一个数据结构课程设计关于赫夫曼编码/解码的问题!!! 急!!!!!

Btree p = NULL;

string dest;

for (int i=0; i  {

p = Search(t, s[i]);

if (p != NULL)

{

dest += p->str;

//dest += ’ ’;

}

}

return dest;

}

//利用赫夫曼树对destCode进行解码

string Decode(string s, HuffmanTree hT)

{

string dest;

int p = 1;

int i = 0;

while (i < s.size())

{

while (hT[p].lc > 0)//非叶子结点

{

if (s[i++] == ’0’)

p = hT[p].lc; //向左结点前进

else

p = hT[p].rc; //向右结点前进

}

dest += hT[p].data; //存储叶子结点

p = 1;

}

return dest;

}

//销毁一棵二叉排序树

void DestroyBTree(Btree & t)

{

if (t福!= NULL)

{

DestroyBTree(t->lc);

DestroyBTree(t->rc);

delete t;

t = NULL;

}

}

//销毁一棵赫夫曼树

void DestroyHfmanTree(HuffmanTree & t, int n)

{

for (int i=n-1; i>=0; i--)

{

delete &t[i];

}

t = NULL;

}

八:程序找错 哈夫曼树的构建

编译问题改好了,逻辑上还有没有问题,你再看看:

#include

#define N 20/*叶子结点的最大值*/

#define M 2*N-1/*所有结点的最大值*/

typedef struct

{

int weight;/*结点的权值*/

int parent;/*双亲的下标*/

int LChild;//左孩子结点的下标*/

int RChild;/*右孩子结点的下标*/

}HTNode,HuffmanTree[M+1];/*HuffmanTree是结构数据组类型,0号单元不用*/

/*选出paeent为0且weight最小,次小的结点*/

select(HuffmanTree ht,int i,int *s1,int *s2) //Error: 这里不要分号!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

{

int m,max=100000,max1=10000,n=0;//Error: n=0前面应该是逗号!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

for(m=1;m<=i-1;i++)//Error:i++前面应该是分号!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

{

/*求最小*/

while(ht[i].parent==0)

{

while(ht[m].weight

{

max=ht[m].weight;

*s1=m;//Er户or:这里不是si,是s1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

}

}

/*求次小*/

while(ht[m].parent==0) //Error:这里不是paeent,是parent!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

{

if(ht[m].weightmax&&*s1!=m)//Error:这里不是s1,是*s1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

{

max1=ht[m].weight;

*s2=m;

}

}

}

}

/*哈夫曼树的构造*/

void CrtHuffmanTree(HuffmanTree ht,int w[],int n)

{/*构造哈夫曼树ht[M+1],w[]存放n个权值*/

int i,m,s1,s2;

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

//ht[i]={w[i],0,0,0}; //Error:结构体不能这么赋值!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

{

ht[i].weight=w[i];

ht[i].parent=0;

ht[i].LChild=0;

ht[i].RChild=0;......余下全文>>

九:1用递归实现二叉树的先序、中序、后序三种遍历。2哈夫曼树问题

//在吗? 我给你。另外我有自己的实验报告。

//里面有递归遍历,有迭代遍历。可以写文件,可以压缩编码。可以读文件。

//你不需要什么功能的话就删去相应的函数就行了。

//希望加分。

#include

#include

#include

#include

using namespace std;

const int maxlen = 10000; //结点最大数目

const int maxlen2 = 260; //字符最大数目,叶节点最大数目

const int maxchar = 260; //字符最大数目

#define INTMAX 10000000; //大数,大于任意一个权值

struct CharSet //程序初始化时保存字符和结点的结构体。

{

char ch;

int weight;

};

struct HaffNode //哈夫曼树结点结构

{

int weight,parent,lchild,rchild;

char ch;

HaffNode() {weight=0; parent=lchild=rchild=-1; ch='\n';}

};

struct HaffCode //哈夫曼树字符编码信息结构

{

unsigned int bit; //通过位运算,用一个无符号整形来表示一串二进制编码。

int startb; //记录偏移量。

int weight;

char ch;

HaffCode() { bit=0; startb = -1; weight=0; ch='\n';}

HaffCode& operator=(HaffCode & obj) //重载赋值符号

{

bit=obj.bit; startb=obj.startb;

ch=obj.ch; weight=obj.weight;

return *this;

}

};

class HaffmanSystem

{

private:

CharSet cs[maxlen/2]; //保存初始化时的字符和权值信息。

HaffNode hn[maxlen]; //保存哈夫曼树结点信息。

HaffCode hc[maxlen/2]; //保存哈夫曼树字符编码信息。

HaffCode hc2[maxchar]; //索引散列。考虑到字符数少,以字符的十进制数作为下标保存和索引字符编码信息,时间为O(1);

int head; //根结点的数组下标。

int n;

int leafnum; //叶节点个数,字符个数。

public:

HaffmanSystem() {n=head=leafnum=0;}

void Haffman(); &......余下全文>>

十:对一串字符进行huffman编码并解码

#include

#include

#include

#include

#define OVERFLOW -1

typedef struct

{

char letter;

int weight;

int parent;

int lchild;

int rchild;

}HTNode,*HuffmanTree;

typedef char * *HuffmanCode;

void Select(HuffmanTree &HT,int i,int &s1,int &s2)

{

/*选择森林中,根结点的权值最小和次小的两个树,

*将其根结点的下标号记入s1和s2中

*/

int j, k;

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

{

if(HT[k].parent != NULL)

continue;

s1 = k;/*init the number*/

break;

}

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

{

if(HT[j].parent != NULL)

continue;

if(HT[j].weight < HT[s1].weight)

s1 = j;

}

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

{

if(HT[k].parent != NULL || k == s1)

continue;

s2 = k;

break;

}

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

{

if(HT[j].parent != NULL)

continue;

if(HT[j].weight <= HT[s2].weight && j != s1)

s2 = j;

}

}

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char *zi,int *w,int n)

{

HuffmanTree p;

int m,i,s1,s2,f,c;

int Istart = 1;

char *cd;

if(n <= 1)

return;

m = 2*n-1;

if(!(HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode))))

exit(OVERFLOW);

for(p=HT+1,i=1;i<=n;++i,++zi,++p,++w)

{

/*生成独立的森林*/

p->parent = NULL;

p->letter = *zi;

p->lchild = NULL;

p->rchild = NULL;

p->weight = *w;

}

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

{

(*p).weight=0;

(*p).parent=0;

(*p).lchild=0;

(*p).rchild=0;

}

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

{

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

HT[s1].parent=i;

HT[s2].parent=i;

......余下全文>>

扫一扫手机访问

发表评论