原帖及讨论:http://bbs.bc-cn.net/dispbbs.asp?boardid=179&id=107388
#include <stdio.h> #include <stdlib.h> 逆风编程技术 #define MaxSize 50 typedef struct{ char c; //代码; int w; //代码权值; char code[MaxSize]; //代码的Huffman编码; }HuffCode[MaxSize]; typedef struct{ int Weight; //权值; int LChild,RChild,Parent; }HTNode,HuffTree[MaxSize]; //================================================================================ void HuffmanTree(HuffTree HT,int length,HuffCode hc);//生成Huffman树; void SelectHTNode(HuffTree HT,int n,int *min1,int *min2);//查找最小和次小序号; void HuffmanCode(HuffTree HT,int len,HuffCode hc);//生成Huffman编码; //================================================================================ int main(void) { HuffTree HT; //Huffman树; HuffCode HC; //Huffman编码; int i,len; printf("<<<<Huffman编码生成程序>>>>\t\tby Haroldi.\n\n请帮助评价一下思路及改善意见!\t多谢了:-)...\n\n\n\n"); printf("\n输入代码数量:");scanf("%d",&len); system("cls");printf("代码数量:-\n\n",len); printf("输入代码及权值(e.g.:\"a16[回车]\" ):\n"); for(i=1;i <= len;i ) { while(getchar() != '\n')NULL; printf("No.-:",i); HC[i].c = getchar(); scanf("%d",&HC[i].w); } HuffmanTree(HT,len,HC); HuffmanCode(HT,len,HC);
printf("\n输出Huffman编码:\n"); for(i = 1;i<=len;i ) { printf("\n %c :",HC[i].c); puts(HC[i].code); } //测试Huffman树结构; printf("\n\n输出Huffman树结构:");system("pause"); printf("\nHT[i]:\t权值\t双亲\t左孩子\t右孩子\n"); for(i = 1;i<2*len;i ) { if(i <= len)printf("(%c)",HC[i].c); printf("-:\t -;\t-,\t -,\t -.\n",\ i,HT[i].Weight,HT[i].Parent,HT[i].LChild,HT[i].RChild); } return 0; } //================================================================================ void HuffmanTree(HuffTree HT,int length,HuffCode hc) //Huffman树初始化; { int i,min1,min2; HT[0].Weight = 65535; for(i = 1;i <= length;i ) { HT[i].Weight = hc[i].w; HT[i].LChild = HT[i].RChild = HT[i].Parent = -1; } for(;i < 2*length;i )//i初值 = length 1; { HT[i].LChild = HT[i].RChild = HT[i].Parent = -1; }
for(i = length 1;i < 2*length;i ) { SelectHTNode(HT,i,&min1,&min2); HT[min1].Parent = i; HT[min2].Parent = i; HT[i].LChild = min1; HT[i].RChild = min2; HT[i].Weight = HT[min1].Weight HT[min2].Weight; } } //================================================================================ void SelectHTNode(HuffTree HT,int n,int *min1,int *min2)//查找最小和次小序号; { int i; *min1 = *min2 = 0; for(i = 1;i < n;i ) { if(HT[i].Parent == -1) { if(HT[*min1].Weight >= HT[i].Weight) { *min2 = *min1; *min1 = i; } else if(HT[*min2].Weight > HT[i].Weight)*min2 = i; } } } //================================================================================ void HuffmanCode(HuffTree HT,int len,HuffCode hc) //生成Huffman编码; { int i,j,tc,Stack[MaxSize],top = -1; char flag[MaxSize]; HTNode th; for(i = 1;i <= len;i ) { top = -1;//栈初始化; j = 0;//hc[i].code串首位置偏移; th = HT[i];//当前结点th; tc = i;//当前结点标记tc; while(th.Parent != -1) {//当前结点th双亲P入栈,由P的孩子是th,确定flag;确定下次结点标记tc; Stack[ top] = th.Parent; if(HT[th.Parent].LChild == tc){flag[top] = 'L'; tc = th.Parent;}
本文章更多内容:1 - 2 - 下一页>> |