哈夫曼函式的簡單程式實現
阿新 • • 發佈:2020-12-28
哈夫曼函式的簡單程式實現
一、 實現內容:輸入有序的6個權值,通過程式碼計算其加權路徑WPL、先序序列輸出該樹。
二、實現程式碼:
#include<stdio.h>
#include<string.h>
#define n 6 //定義所要的權值數量
#define MAX 999 //監督員
#define NULL 0
typedef struct Hfnode
{
int data;
struct Hfnode *Lson,*Rson,*next;
}Hfnode,*Hfptr; //定義結點型別
Hfptr inition () //初始化
{ int i; Hfptr h,p;
h=p=new Hfnode;
h->data=MAX;
for (i=1;i<=n;i++)
{ p->next=new Hfnode;
p=p->next;
p->Lson=p->Rson=NULL;
scanf("%d",&p->data);
}
p->next=h;
return h;
}
Hfptr creatHftree(Hfptr head) //構造哈夫曼函式
{ int i;Hfptr p,q,r,t1,t2;
int WPL=0;
for(i=1;i<n;i++)
{ r=new Hfnode;
t1=head->next;
t2=t1->next;
r->data=t1->data+t2->data; //權值相加
WPL+=r->data; //求加權路徑長
r->Lson=t1; //t1,t2做新根r的左右兒子
r->Rson=t2;
head->next=t2->next;
q=head;
p=head->next;
while(1)
if(p->data< r->data)
{q=p;
p=p->next;
}
else{
r->next=p;
q->next=r;
break;}
}
p=head->next;
printf("%d\n",WPL);
delete head;
return (p);
}
void preorder(Hfptr p) //先序遍歷
{
if(p==NULL)return;
printf("%4d",p->data);
preorder(p->Lson);
preorder(p->Rson);
}
void Hfmain() //呼叫函式
{
Hfptr Hfroot,head;
head=inition();
printf("加權路徑WPL為:\n");
Hfroot=creatHftree(head);
printf("按先序序列輸出為:\n");
preorder(Hfroot);
}
int main() //主函式
{
Hfmain();
return 0;
}
三、程式碼結果
四、優化
原始碼直接按輸出順序進行連線,所以需要按順序輸入,所連線的才是按順序的連線。如果要不按順序地連線,可以加一個排序的函式,並在連線前呼叫。