哈夫曼编码和译码c语言,C语言实现哈夫曼编码与译码.doc

信息工程1102 苑博 2011116020230

C语言实现哈夫曼编码与译码

#include;

#define n 6 ;

#define m (2*n-1) ;

#define maxval 10000.0;

#define maxsize 100 ;

typedef struct;

{

char ch;

float weight;

int lchild,rchild,parent;

}hufmtree;

typedef struct;

{

char bits[n];

int start;

char ch;

}codetype;

void huffman(hufmtree tree[]);

void huffmancode(codetype code[],hufmtree tree[]);

void decode(hufmtree tree[]);

void main()

{

printf(" ——哈夫曼编码——\n");

printf("总共有%d个字符\n",n);

hufmtree tree[m];

codetype code[n];

int i,j;

huffman(tree);

huffmancode(code,tree);

printf("【输出每个字符的哈夫曼编码】\n");

for(i=0;i

{

printf("%c: ",code[i].ch);

for(j=code[i].start;j

printf("%c ",code[i].bits[j]);

printf("\n");

}

printf("【读入电文,并进行译码】\n");

decode(tree);

}

void huffman(hufmtree tree[])

{

int i,j,p1,p2;

float small1,small2,f;

char c;

for(i=0;i

{

tree[i].parent=0;

tree[i].lchild=-1;

tree[i].rchild=-1;

tree[i].weight=0.0;

}

printf("【依次读入前%d个结点的字符及权值(中间用空格隔开)】\n",n);

for(i=0;i

{

printf("输入第%d个字符为和权值",i+1);

scanf("%c %f",&c,&f);

getchar();

tree[i].ch=c;

tree[i].weight=f;

}

for(i=n;i

{

p1=0;p2=0;

small1=maxval;small2=maxval; /

for(j=0;j

if(tree[j].parent==0)

if(tree[j].weight

{

small2=small1;

small1=tree[j].weight;

p2=p1;

p1=j;

}

else

if(tree[j].weight

{

small2=tree[j].weight; /

p2=j;

}

tree[p1].parent=i;

tree[p2].parent=i;

tree[i].lchild=p1;

tree[i].rchild=p2;

tree[i].weight=tree[p1].weight+tree[p2].weight;

}

}//huffman

void huffmancode(codetype code[],hufmtree tree[])

{

int i,c,p;

codetype cd; for(i=0;i

{

cd.start=n;

cd.ch=tree[i].ch;

c=i;

p=tree[i].parent;

while(p!=0)

{

cd.start--;

if(tree[p].lchild==c)

cd.bits[cd.start]='0';

else

cd.bits[cd.start]='1';

c=p;

p=tree[p].parent;

}

code[i]=cd;

以下是哈夫曼编码译码的 C 语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义哈夫曼树节点 typedef struct huffman_node { char ch; // 当前节点表示的字符 int weight; // 当前节点的权重 struct huffman_node *left; // 左子节点指针 struct huffman_node *right; // 右子节点指针 } huffman_node; // 定义哈夫曼编码表节点 typedef struct huffman_code { char ch; // 当前节点表示的字符 char *code; // 当前节点的哈夫曼编码 } huffman_code; // 计算字符出现的频率 void calc_freq(char *str, int *freq) { int len = strlen(str); for (int i = 0; i < len; i++) { freq[(int)str[i]]++; } } // 初始化哈夫曼树节点 huffman_node *init_node(char ch, int weight) { huffman_node *node = (huffman_node *)malloc(sizeof(huffman_node)); node->ch = ch; node->weight = weight; node->left = NULL; node->right = NULL; return node; } // 构建哈夫曼树 huffman_node *build_tree(int *freq) { huffman_node *nodes[256]; int node_count = 0; for (int i = 0; i < 256; i++) { if (freq[i] > 0) { nodes[node_count++] = init_node((char)i, freq[i]); } } while (node_count > 1) { int min1 = 0, min2 = 1; if (nodes[min1]->weight > nodes[min2]->weight) { int temp = min1; min1 = min2; min2 = temp; } for (int i = 2; i < node_count; i++) { if (nodes[i]->weight < nodes[min1]->weight) { min2 = min1; min1 = i; } else if (nodes[i]->weight < nodes[min2]->weight) { min2 = i; } } huffman_node *new_node = init_node('\0', nodes[min1]->weight + nodes[min2]->weight); new_node->left = nodes[min1]; new_node->right = nodes[min2]; nodes[min1] = new_node; nodes[min2] = nodes[--node_count]; } return nodes[0]; } // 生成哈夫曼编码表 void gen_codes(huffman_node *node, char *code, int depth, huffman_code *codes, int *code_count) { if (node->left == NULL && node->right == NULL) { codes[*code_count].ch = node->ch; codes[*code_count].code = (char *)malloc((depth + 1) * sizeof(char)); memcpy(codes[*code_count].code, code, depth); codes[*code_count].code[depth] = '\0'; (*code_count)++; } else { code[depth] = '0'; gen_codes(node->left, code, depth + 1, codes, code_count); code[depth] = '1'; gen_codes(node->right, code, depth + 1, codes, code_count); } } // 哈夫曼编码 void huffman_encode(char *str, huffman_code *codes, int code_count) { int len = strlen(str); for (int i = 0; i < len; i++) { for (int j = 0; j < code_count; j++) { if (str[i] == codes[j].ch) { printf("%s", codes[j].code); break; } } } } // 哈夫曼译码 void huffman_decode(char *str, huffman_node *root) { huffman_node *node = root; int len = strlen(str); for (int i = 0; i < len; i++) { if (str[i] == '0') { node = node->left; } else { node = node->right; } if (node->left == NULL && node->right == NULL) { printf("%c", node->ch); node = root; } } } int main() { char str[100]; printf("请输入字符串:"); scanf("%s", str); int freq[256] = {0}; calc_freq(str, freq); huffman_node *root = build_tree(freq); char code[256] = {0}; huffman_code codes[256]; int code_count = 0; gen_codes(root, code, 0, codes, &code_count); printf("哈夫曼编码结果:"); huffman_encode(str, codes, code_count); printf("\n"); printf("哈夫曼译码结果:"); huffman_decode("11011101001001101011011101111110011110100110001011110100011111001011011011101101100101101010101101001101001110100011001001001111010011110101110111111110101111001000001110111110000001101100000111101101000010110010011001010111010010101011101110010", root); printf("\n"); return 0; } ``` 这是一个简单的哈夫曼编码译码实现,可以直接运行,输入字符串后会输出哈夫曼编码译码的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值