1. 程式人生 > 其它 >哈夫曼函式的簡單程式實現

哈夫曼函式的簡單程式實現

技術標籤:哈夫曼資料結構c++演算法

哈夫曼函式的簡單程式實現

一、 實現內容:輸入有序的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; }

三、程式碼結果

在這裡插入圖片描述

四、優化

原始碼直接按輸出順序進行連線,所以需要按順序輸入,所連線的才是按順序的連線。如果要不按順序地連線,可以加一個排序的函式,並在連線前呼叫。