資源簡介
實現了Huffman編碼算法:
1、使用鏈表結構。
2、使用《數據結構》(嚴蔚敏,C語言版)中給出的算法;
3、增加預先排序的功能的算法

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#define?NULL?0
#define?OK?1
#define?ERROR?0
#define?OVERFLOW?-2
#define?MAX_NUM?10000
#define?MAX?60
typedef?int?Status;
typedef?char?**HuffmanCode;
typedef?struct{
???????unsigned?int??????weight;
???????unsigned?int??????parentlchildrchild;
}HTNode*HuffmanTree;
typedef?struct{
???????HuffmanTree?HT;
???????char????*c;
???????int?????longth;
???????HuffmanCode?HC;
}Huffman;
void?Select(HuffmanTree?HTint?endint?*s1int?*s2)
{
?????int?i;
?????int?min1=MAX_NUM;
?????int?min2;
?????for?(i=1;i<=end;i++)
?????{
???????if?(HT[i].parent==0?&&?HT[i].weight ???????{
?????????*s1=i;
?????????min1=HT[i].weight;
???????}
?????}
?????min2=MAX_NUM;
?????for(i=1;i<=end;i++)
?????{
???????if(HT[i].parent==0&&(*s1!=i)&&min2>HT[i].weight)
???????{
?????????*s2=i;
?????????min2=HT[i].weight;
???????}
?????}
}
Huffman?HuffmanCoding(Huffman?Hfm)
{
?????/*---------------------------------*/
?????int?inms1s2start;
?????int?cf;
?????char?*cd;
?????n=Hfm.longth;
?????if(n<=1)?????return?Hfm;
?????m=2*n-1;
??
?????for(i=n+1;i<=m;++i)
?????{
???????Select(Hfm.HTi-1&s1&s2);
???????Hfm.HT[s1].parent=i;
???????Hfm.HT[s2].parent=i;
???????Hfm.HT[i].lchild=s1;
???????Hfm.HT[i].rchild=s2;
???????Hfm.HT[i].weight=Hfm.HT[s1].weight+Hfm.HT[s2].weight;
?????}
?????/*------------------------------------------*/
?????Hfm.HC=(HuffmanCode)malloc((n+1)*sizeof(char?*));
?????cd=(char?*)malloc(n*sizeof(char));
?????cd[n-1]=‘\0‘;
?????for(i=1;i<=n;++i)
?????{
???????start=n-1;
???????for(c=if=Hfm.HT[i].parent;f!=0;c=ff=Hfm.HT[f].parent)
???????{
?????????if(c==Hfm.HT[f].lchild)?????cd[--start]=‘0‘;
?????????else?cd[--start]=‘1‘;
???????}
???????Hfm.HC[i]=(char?*)malloc((n-start)*sizeof(char));
???????strcpy(Hfm.HC[i]&cd[start]);
?????}
?????free(cd);
?????return?Hfm;
}
Huffman?InputHuffman(Huffman?Hfm)
{
???????int?in;
???????system(“cls“);
???????printf(“\n\n\t\t********************Initial*********************\n“);
???????printf(“\tThe?chars?and?weights?will?be?saved?in?the?file?\“hfmTree\“\n“);
???????printf(“Please?input?the?number?of?the?chars:?“);
???????scanf(“%d“&n);
???????Hfm.HT=(HuffmanTree)malloc((2*n)*sizeof(HTNode));
???????Hfm.c=(char?*)malloc((n+1)*sizeof(char));
???????for(i=1;i<=n;i++)
???????{
?????????printf(“Please?input?the?char:?“);
?????????scanf(“%s“&Hfm.c[i]);
?????????printf(“Please?input?the?weight?of?the?char:?“);
?????????scanf(“%d“&Hfm.HT[i].weight);
?????????Hfm.HT[i].parent=0;
?????????Hfm.HT[i].lchild=0;
?????????Hfm.HT[i].rchild=0;
???????}
???????for(;i<=2*n-1;++i)
???????{
?????????Hfm.HT[i].weight=0;
?????????Hfm.HT[i].parent=0;
?????????Hfm.HT[i].lchild=0;
?????????Hfm.HT[i].rchild=0;
???????}
???????Hfm.longth=n;
???????return?Hfm;
}
Huffman?InitHuffman(Huffman?Hfm)
{
?????int?ni;
?????FILE?*fp;
?????fp=fopen(“hf
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????7699??2010-04-24?21:53??hefuman\11.cpp
?????文件???????3353??2010-04-25?16:31??hefuman\11.dsp
?????文件????????512??2010-04-25?18:34??hefuman\11.dsw
?????文件??????41984??2010-04-25?18:34??hefuman\11.ncb
?????文件??????48640??2010-04-25?18:34??hefuman\11.opt
?????文件????????736??2010-04-25?16:32??hefuman\11.plg
?????文件??????????0??2010-04-25?16:35??hefuman\CodeFile
?????文件???????4291??2010-04-20?22:08??hefuman\hefuman.dsp
?????文件????????522??2010-04-20?21:50??hefuman\hefuman.dsw
?????文件??????33792??2010-04-20?22:08??hefuman\hefuman.ncb
?????文件??????48640??2010-04-20?22:08??hefuman\hefuman.opt
?????文件????????692??2010-04-20?21:56??hefuman\hefuman.plg
?????文件??????????0??2010-04-25?18:30??hefuman\hfmTree
?????文件?????????53??2010-04-25?16:36??hefuman\TextFile
?????文件?????213041??2010-04-25?16:32??hefuman\Debug\11.exe
?????文件?????239692??2010-04-25?16:32??hefuman\Debug\11.ilk
?????文件??????21491??2010-04-25?16:31??hefuman\Debug\11.obj
?????文件?????230516??2010-04-24?13:16??hefuman\Debug\11.pch
?????文件????1188864??2010-04-24?21:53??hefuman\Debug\11.pdb
?????文件??????????0??2010-04-29?17:49??hefuman\Debug\CodeFile
?????文件?????213046??2010-04-20?21:50??hefuman\Debug\hefuman.exe
?????文件?????235516??2010-04-20?21:50??hefuman\Debug\hefuman.ilk
?????文件?????230516??2010-04-20?21:50??hefuman\Debug\hefuman.pch
?????文件?????459776??2010-04-20?21:50??hefuman\Debug\hefuman.pdb
?????文件?????????18??2010-04-29?17:14??hefuman\Debug\hfmTree
?????文件??????74752??2010-04-25?18:30??hefuman\Debug\vc60.idb
?????文件?????110592??2010-04-24?21:53??hefuman\Debug\vc60.pdb
?????目錄??????????0??2010-04-30?21:20??hefuman\Debug
?????目錄??????????0??2010-04-30?21:20??hefuman
-----------?---------??----------?-----??----
............此處省略2個文件信息
- 上一篇:OSPF基于C語言的算法實現
- 下一篇:ymodem發送代碼(c語言)
評論
共有 條評論