该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include "HFM.h"
#include "stdlib.h"
#include "stdio.h"
static HFMTree tree;
HFMCell cells[MAX_LEN];
HFMCell saved[MAX_LEN];
static HFMCell swapCell;//专门用于交换的临时空间
static int saveIndex;//保存元素的起始索引值
static HFMCoded coded[MAX_LEN];
void InitHeap()
{
int i;
memset(cells,0,sizeof(HFMCell)*MAX_LEN);
memset(saved,0,sizeof(HFMCell)*MAX_LEN);
saveIndex=0;
for(i=0;i
{
cells[i].kind=CHARACTER;
cells[i].right=cells[i].left=-1;
saved[i].right=saved[i].left=-1;
}
tree.cellRoot=0;
tree.num=0;
}
void Swap(long a,long b)
{
if(a==b)
return;
memcpy(&swapCell,cells+a,sizeof(HFMCell));
memcpy(cells+a,cells+b,sizeof(HFMCell));
memcpy(cells+b,&swapCell,sizeof(HFMCell));
}
int Compare(long a,long b)
{
return cells[a].weight
}
void Insert(LPHFMCell cell)
{
int temp=tree.num;
if(tree.num>=MAX_LEN)
return;
memcpy(cells+tree.num,cell,sizeof(HFMCell));
tree.num++;
for(;;)
{
if(temp!=0&&(Compare(temp,(temp-1)/2)))
{
Swap(temp,(temp-1)/2);
temp=(temp-1)/2;
}
else
break;
}
}
int Delete()
{
int temp=0, smaller;
int left,right;
Swap(0,tree.num-1);
tree.num--;
for(;;)
{
left=temp*2+1;right=temp*2+2;
if(left>=tree.num)
break;
else if(right>=tree.num)
smaller=left;
else
smaller=(Compare(left,right))?left:right;
if(Compare(temp,smaller))
break;
else
{
Swap(smaller,temp);
temp=smaller;
}
}
return tree.num;
}
int CopySaved(int a)
{
int temp=saveIndex;
memcpy(saved+saveIndex, cells+a, sizeof(HFMCell));
saveIndex++;
return temp;
}
static int codeIndex=0;
//左岔0 右岔1
void AssignCode(int index,int weight,int digLen)
{
if(saved[index].kind==CHARACTER)
{
coded[codeIndex].character=saved[index].ch;
coded[codeIndex].code=weight;
coded[codeIndex].digLen=digLen;
codeIndex++;
return;
}
if(saved[saved[index].left].kind==CHARACTER)
{
coded[codeIndex].character=saved[saved[index].left].ch;
coded[codeIndex].code=weight<<1;
coded[codeIndex].digLen=digLen+1;
codeIndex++;
}
else
{
AssignCode(saved[index].left,weight<<1,digLen+1);
}
if(saved[saved[index].right].kind==CHARACTER)
{
coded[codeIndex].character=saved[saved[index].right].ch;
coded[codeIndex].code=(weight<<1)+1;
coded[codeIndex].digLen=digLen+1;
codeIndex++;
}
else
{
AssignCode(saved[index].right,(weight<<1)+1,digLen+1);
}
}
void HFMCode()
{
int least,seconLeast;
HFMCell temp;
temp.kind=NODE;
temp.ch=-1;
while(tree.num>1)
{
least=Delete();
seconLeast=Delete();//获得两个最小权值的元素
temp.weight=cells[least].weight+cells[seconLeast].weight;
temp.left=CopySaved(least);
temp.right=CopySaved(seconLeast);
Insert(&temp);
}
memset(coded,0,sizeof(HFMCoded)*MAX_LEN);
AssignCode(cells[0].left,0,1);
AssignCode(cells[0].right,1,1);
}
void BeginCoding(char sourpath[],char despath[])
{
FILE* infile;
FILE* outfile;
char ch;
int i,j,digLen,code;
char temp=0;