哈夫曼编码和译码c语言,哈夫曼编码译码C语言编写

满意答案

00e27ab806e4881f8254fe7ae8741834.png

kitwz775

2013.06.17

00e27ab806e4881f8254fe7ae8741834.png

采纳率:54%    等级:12

已帮助:8258人

#include

#include

#include

typedef char ElemType;

typedef struct{

ElemType elem;

unsigned int weight;

unsigned int parent,lchild,rchild;

}HTNode,*HuffmanTree;

typedef char** HuffmanCode;

typedef int Status;

typedef struct {

char elem;

unsigned int weight;

}Weight; // save the information of the symbolizes;

void HuffmanCoding(HuffmanTree *,HuffmanCode *,Weight *,int);

void Select(HuffmanTree,int,int *,int *);

void OutputHuffmanCode(HuffmanTree,HuffmanCode,int);

Status main(void)

{

HuffmanTree HT;

HuffmanCode HC;

Weight *w;

char c;

int i,n;

int wei;

printf("input the tatol number of the Huffman Tree:" );

scanf("%d",&n);

w=(Weight *)malloc(n*sizeof(Weight));

for(i=0;i

printf("input the element & its weight:");

scanf("%1s%d",&c,&wei);

w[i].elem=c;

w[i].weight=wei;

}

HuffmanCoding(&HT,&HC,w,n);

OutputHuffmanCode(HT,HC,n);

return 1;

}

00分享举报

以下是哈夫曼编码译码的 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、付费专栏及课程。

余额充值