赫夫曼树编码的表示与实现--自己写数据结构
来源:互联网 发布:淘宝金币抵扣怎么设置 编辑:程序博客网 时间:2024/05/21 11:12
头文件huffman.h
#ifndef _HUFFMAN_H_#define _HUFFMAN_H_#define MAX_WEIGHT 10000typedef struct _HTNode{ int weight; int parent,lchild,rchild; char data;}HTNode,*pHTNode;typedef char** huffmancode;void select_min_weight(HTNode* btree,int mn,int* s1,int* s2);//void read_huffman_code(huffmancode code,HTNode** tree,int n);void creat_huffman_tree(huffmancode code,HTNode** tree,char* pdata,int* pweight,int n);#endif
相关数据结构huffman.c
/***************************时间:2014.12.17作者:XIAO_PING_PING编译环境:DEV-C++ 4.9.9.2 内容:赫夫曼树编码的表示与实现 功能: 学习写数据结构 ****************************/#include <string.h>#include <stdlib.h>#include "huffman.h" void select_min_weight(HTNode* btree,int mn,int* s1,int* s2){ int mweight1,mweight2,i; mweight1 = MAX_WEIGHT; for(i = 0;i < mn;i++) { if(((btree+i)->weight < mweight1)&&(0 == (btree+i)->parent)) { *s1 = i; mweight1 = (btree+i)->weight; // *s1 = (btree+i)->weight; // nmin = i; } } mweight2 = MAX_WEIGHT; for(i = 0;i < mn;i++) { if(((btree+i)->weight < mweight2)&&(0 == (btree+i)->parent)&&(*s1 != i)) { *s2 = i; mweight2 = (btree+i)->weight; } }}/*void read_huffman_code(huffmancode code,HTNode** tree,int n){ int i; char *chs; int start; int c,f; code = (huffmancode)malloc(n * sizeof(char *)); chs = (char *)malloc(n * sizeof(char *)); chs[n-1] = '\0'; for(i = 0;i < n;i++) { start = n - 1; for(c = i,f = *tree[i].parent;f != 0;c = f,f = *tree[f].parent) { if(*tree[f].lchild == c) { chs[--start] = '0'; } else { chs[--start] = '1'; } } code[i] = (char *)malloc((n - start)*sizeof(char)); strcpy(code[i],&chs[start]); printf("%c: %s",*tree[i].data,code[i]); } free(cd);}*/void creat_huffman_tree(huffmancode code,HTNode** tree,char* pdata,int* pweight,int n){ int i,m; int *order1,*order2; pHTNode p; order1 = (int *)malloc(sizeof(int)); order2 = (int *)malloc(sizeof(int)); m = n*2 - 1; *tree = (HTNode *)malloc(m * sizeof(HTNode)); p = *tree; for(i = 0;i < n;i++,p++) { p->weight = *(pweight+i); p->parent = 0; p->lchild = 0; p->rchild = 0; p->data = *(pdata+i); } for(i = n;i < m;i++,p++) { p->parent = 0; } for(i = n;i < m;i++) { select_min_weight(*tree,i,order1,order2); (*tree + i)->weight = (*tree + *order1)->weight + (*tree + *order2)->weight; (*tree + i)->lchild = *order1; (*tree + i)->rchild = *order2; (*tree + *order1)->parent = i; (*tree + *order2)->parent = i; printf ("order1.weight and order2.weight in round %d: %d, %d\n",\ i, (*tree + *order1)->weight, (*tree + *order2)->weight); /* 用于测试 */ printf ("\n"); } //int i; char *chs; int start; int c,f; code = (huffmancode)malloc(n * sizeof(char *)); chs = (char *)malloc(n * sizeof(char *)); chs[n-1] = '\0'; for(i = 0;i < n;i++) { start = n - 1; for(c = i,f = (*tree + i)->parent;f != 0;c = f,f = (*tree + f)->parent) { if((*tree + f)->lchild == c) { chs[--start] = '0'; } else { chs[--start] = '1'; } } code[i] = (char *)malloc((n - start)*sizeof(char)); strcpy(code[i],&chs[start]); printf("%c : %s\n",(*tree + i + 1)->data,code[i]); } free(chs);}
测试文件test.c如下
#include <string.h>#include <stdlib.h>#include "huffman.h"int main(){ int N,i; //char nCR = 0; int* weights; char* datas; pHTNode phash; huffmancode pcode; printf("n = "); scanf("%d",&N); datas = (char *)malloc((N + 2) * sizeof(char)); weights = (int *)malloc(N * sizeof(int)); printf("请输入编码字符:"); for(i = 0;i < (N+2);i++) { scanf("%c",datas+i); //'#结束' //scanf("%c",&nCR); //while('\n' == nCR); //nCR = 0; } printf("请输入对应权值:\n"); for(i = 0;i < N;i++) { scanf("%d",weights+i); } creat_huffman_tree(pcode,&phash,datas,weights,N); getch(); return 0; }
运行结果如下:
0 0
- 赫夫曼树编码的表示与实现--自己写数据结构
- 多维数组的存储表示与实现--自己写数据结构
- 广义表的递归数据结构的表示与实现--自己写数据结构
- 栈的链式结构表示与实现——自己写数据结构
- 串的堆分配存储表示与实现--自己写数据结构
- 【自己动手写数据结构】 -- 循环队列的表示与实现
- 哈希表链地址法表示与实现--自己写数据结构
- 看数据结构写代码(37) 图的十字链表的表示与实现
- 数据结构:赫夫曼树和赫夫曼编码的存储表示
- C语言 队列的链式结构的实现与表示 数据结构 队列的实现与表示
- 数据结构教程 第二课 抽象数据类型的表示与实现
- C语言 数组的顺序表示与实现 数据结构
- 数据结构---线性表的链式表示与实现
- 重温数据结构-线性表的顺序表示与实现
- 【数据结构】串的堆分配表示与实现
- 数据结构—线性表的顺序表示与实现
- 数据结构--线性表的链式表示与实现
- 《数据结构》---线性表的顺序表示与实现
- sql数据 日期型数据模糊查询
- Resource leak: 'context' is never closed
- 创建Access数据的ODBC数据源时没有Access数据源驱动器
- SDUST_OJ-1608-斐波那契数列
- 苹果机(流星程序集之一)
- 赫夫曼树编码的表示与实现--自己写数据结构
- 第一篇
- QQ斗地主记牌器(流星程序集之二)
- 小小的总结和展望
- 关于学习Git知识网站
- NFS配置
- WIN消息发送工具(流星程序集之三)
- 一个选号程序(流星程序集之四)
- 【BZOJ】【P3823】【定情信物】【题解】【线性筛逆元】