huffman图像编码C语言,Huffman编码 数据结构 C语言

本文介绍了一个Huffman编码的实现案例,包括Huffman树的构建、编码生成与译码过程。通过具体的C语言代码示例,详细展示了如何针对一组字符生成最优前缀编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为解决广大童鞋的数据结构实验问题写下本文:(只做参考哦。)

实验要求:

Huffman编码(二叉树)

l实验目的:熟练掌握二叉树应用(Huffman编码)的基本算法实现。

l实现功能:对输入的一串电文字符实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。实现功能如下:

¨Huffman树的建立

¨Huffman编码的生成

¨编码文件的译码

l实验机时:4

l设计思路:

数据结构:

#define n 100

//叶子结点数

#define m 2*n-1

// Huffman树中结点总数

typedef struct {

int weight;

//权值

int lchild , rchild , parent; //左右孩子及双亲指针

}HTNode; //树中结点类型

typedef HTNode HuffmanTree[m+1];

//0号单元不用

主要实现函数:

n统计字符串中字符的种类以及各类字符的个数的函数

n构造Huffman树的函数

nHuffman编码的函数

n建立正文的编码文件的函数

n代码文件的译码函数

n主函数

代码如下:

#include

#include

#include

#define

n 5 //叶子结点数

#define

m 2*n-1 // Huffman树中结点总数

typedef

struct

{

int weight; //权值

int lchild ,

rchild , parent;

//左右孩子及双亲指针

}

HTNode;  //树中结点类型

HTNode

HuffmanTree[m+1]; //0号单元不用

char

huffman[n+1][m+1];

void

Select(int &s1, int &s2,int j)

{

int i;

int tmp1 = 10000, tmp2 =

10000;

for(i = 1; i

<= j; i++)

{

if(HuffmanTree[i].parent == 0)

{

if(HuffmanTree[i].weight < tmp1)

{

tmp1 =

HuffmanTree[i].weight;

s1 = i;

}

else

if(HuffmanTree[i].weight < tmp2)

{

tmp2 =

HuffmanTree[i].weight;

s2= i;

}

}

}

}

void

HuffmanCoding(int weight[],int letter[])

{

int i;

if(n<1)

return;

for(i=1; i<=n;

i++)

{

HuffmanTree[i].weight=weight[i-1];

HuffmanTree[i].lchild=0;

HuffmanTree[i].rchild=0;

HuffmanTree[i].parent=0;

}

for(i=7; i<=m;

i++)

{

HuffmanTree[i].weight=0;

HuffmanTree[i].lchild=0;

HuffmanTree[i].rchild=0;

HuffmanTree[i].parent=0;

}

//Huffman树的建立

for(i=n+1;

i<=m; i++)

{

int s1,s2;

Select(s1,s2,i-1);

HuffmanTree[s1].parent=i;

HuffmanTree[s2].parent=i;

HuffmanTree[i].lchild=s1;

HuffmanTree[i].rchild=s2;

HuffmanTree[i].weight=HuffmanTree[s1].weight+HuffmanTree[s2].weight;

}

char cd[n+1];

int start,c,f;

cd[n-1]= '\0';

for(i=1;

i

{

start=n-1;

for(c=i,f=HuffmanTree[i].parent; f!=0;

c=f,f=HuffmanTree[f].parent)

{

if(HuffmanTree[f].lchild==c)

cd[--start]='0';

else

cd[--start]='1';

}

strcpy(huffman[i],&cd[start]);

}

char x='a';

for(i=1; i<=n;

i++)

{

printf("字符:%c

Huffman编码:%s\n",x++,huffman[i]);

}

}

int

main()

{

int weight[n]=

{1,3,2,4,5};

int letter[n]=

{'a','b','c','d','e'};

HuffmanCoding(weight,letter);

return 0;

}

weight值什么的自己改吧。最好看明白自己写哦。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值