1. 程式人生 > >哈夫曼樹 (c語言)資料結構

哈夫曼樹 (c語言)資料結構

for(i=1;i<=len;i++)
{
if(ht[i].w<min2&&ht[i].p==0&&i!=*s1)
{
min2=ht[i].w;
*s2=i;
}
}//找到另一個最小的元素


}
hfmsNode *createhfms(int n)//構造哈夫曼樹
{
    hfmsNode *ht;
int i,s1,s2,m;
if(n<=1)
return NULL;
m=2*n-1;
ht=(hfmsNode *)malloc((2*n)*sizeof(hfmsNode));
    for(i=1;i<=m;i++)
{
ht[i].p=0;
ht[i].l=0;
ht[i].r=0;
}//為每個結點的p,l,r賦初值
   for(i=1;i<=n;++i)
   {
  scanf("%d",&(ht[i].w));
   }//為每個葉子結點賦初值
  for(i=n+1;i<=m;i++)
  {
 select(ht,i-1,&s1,&s2);
     //通過n-1次的選擇,刪除,合併來建立哈夫曼數
 ht[s1].p=i;
 ht[s2].p=i;
// ht[k]中選擇兩個其雙親域為0且權值最小的結點,並返回他們在ht中的序號s1,s2
   ht[i].l=s1;
   ht[i].r=s2;//s1,s2分別作為i的左右孩子
   ht[i].w=ht[s1].w+ht[s2].w;//i的權值作為左右孩子權值之和
  }
  return ht;
}
void createhfmsCode(hfmsNode *ht,hfmsCode *HC, int n)//哈夫曼樹編碼
{
int i,c,start;
char *cd;
int f;
HC=(char * *)malloc((n+1)*sizeof(char *));
cd=(char *)malloc(n*sizeof(char));//分配臨時儲存字元編碼的動態空間
cd[n-1]='\0';//編碼結束符
for(i=1;i<=n;++i)//逐個求字元編碼
{
start=n-1;//start開始指向編碼結束的位置
c=i;
f=ht[i].p;//f指向結點的雙親
while(f!=0)//從葉子結點開始回溯,直到根結點
{
--start;//回溯一次,start向前指向一個位置
if(ht[f].l==c)
cd[start]='0';//結點c是f的左孩子
else
cd[start]='1';//否則c是f的右孩子
c=f;
f=ht[f].p;//繼續向上回溯
}
HC[i]=(char *)malloc((n-start)*sizeof(char));//為第一個字元編碼分配空間
strcpy(HC[i], &cd[start]);//把求得的編碼的首地址從cd[start]複製到HC的當前行
    }
free(cd);
for(i=1;i<=n;i++)
{
printf("權值為%d的葉子結點的哈夫曼編碼:%s",ht[i].w,HC[i]);
printf("\n");
}


}
void  createhfmsCode1(hfmsNode *ht,int m)//哈夫曼樹的譯碼
{
int i=m,j=0;
    char b[N];
getchar();
printf("輸入以.結束的編碼值:");
scanf("%s",b);
while(b[j]!='.')
{
if(b[j]=='0'{
i=ht[i].l;//為0時是左孩子
}
else
i=ht[i].r;
if(ht[i].l==NULL)
{