『壹』 編寫一個程序,構造一棵哈夫曼樹
#include<stdio.h>
#include<string.h>
#define N 50 //葉子結點數
#define M 2*N-1 //樹中結點總數
typedef struct
{ char data[5]; //節點值
int weight; //權重
int parent; //雙仔世親結點
int lchild; //左孩子結點
int rchild; //右孩子結點
}htnode;
typedef struct
{ char cd[N]; //存放哈夫曼碼
int start;
}hcode;
void createht(htnode ht[],int n) //構造哈夫曼樹
{ int i,k,lnode,rnode;
int min1,min2;
for(i=0;i<2*n-1;i++) //所有結點的相關域置初值-1
ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
for(i=n;i<2*n-1;i++) //構造哈夫曼樹
{ min1=min2=32767; //lchild和rchild為最小權重的兩個結點位置
lnode=rnode=-1;
for(k=0;k<=i-1;k++)
if(ht[k].parent==-1) //只在尚未構造二叉樹的結點中查找
{ if(ht[k].weight<min1)
{ min2=min1;
rnode=lnode;
min1=ht[k].weight;
lnode=k;
}
else if(ht[k].weight<min2)
{ min2=ht[k].weight;
rnode=k;
}
}
ht[lnode].parent=i;
ht[rnode].parent=i;
ht[i].weight=ht[lnode].weight+ht[rnode].weight;
ht[i].lchild=lnode;
ht[i].rchild=rnode;
}
}
void createhcode(htnode ht[],hcode hcd[],int n) //構造雀汪哈夫曼編碼
{ int i,f,c;
hcode hc;
for(i=0;i<n;i++) //根據哈夫曼樹求哈夫曼編碼
{ hc.start=n;
c=i;
f=ht[i].parent;
while(f!=-1) //循序直到樹根結點
{ if(ht[f].lchild==c) //處理左孩子結點
hc.cd[hc.start--]='0';
else
hc.cd[hc.start--]='1'; //處理右孩子結點
c=f;
f=ht[f].parent;
}
hc.start++; //start指向哈夫曼編碼最開始字元
hcd[i]=hc;
}
}
void disphcode(htnode ht[],hcode hcd[],int n) // 輸出哈夫曼編碼
{ int i,k;
int sum=0,m=0,j;
printf("輸出哈夫曼編碼:\n");
for(i=0;i<n;i++)
{ j=0;
printf(" %s:\t"頃戚仔,ht[i].data);
for(k=hcd[i].start;k<=n;k++)
{ printf("%c",hcd[i].cd[k]);
j++;
}
m+=ht[i].weight;
sum+=ht[i].weight*j;
printf("\n");
}
printf("\n平均長度=%g\n",1.0*sum/m);
}
void main()
{ int n=15,i;
char *str[]={"The","of","a","to","and","in","that","he","is","at","on","for","His","are","be"};
int fnum[]={1192,677,541,518,462,450,242,195,190,181,174,157,138,124,123};
htnode ht[M];
hcode hcd[N];
for(i=0;i<n;i++)
{ strcpy(ht[i].data,str[i]);
ht[i].weight=fnum[i];
}
printf("\n");
createht(ht,n);
createhcode(ht,hcd,n);
disphcode(ht,hcd,n);
printf("\n");
}
『貳』 哈夫曼樹編碼解碼,c語言做的,第17行就是錯,搞不懂啊,求高手指點一下啊
首先一個錯誤是
HaffmanTree 這個打錯了 應該是HuffmanTree 這個才是你定義的數據類型
除了這個以外 由於代碼不全 所以無法確定是否還有其他問題
『叄』 創建一個哈夫曼樹並且進行編碼權重如下w={5,29,7 8,14,13 ,3 ,11}寫出c語言代碼
#include"stdafx.h"
#include"hfm.h"
#include<string.h>
#include<malloc.h>//malloc()等
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<limits.h>
#include<iostream>
#defineTRUE1
#defineFALSE1
#defineOK1
#defineERROR1
#defineINFEASIBLE-1
typedefintStatus;
typedefintBoolean;
/************************************************************************/
/*最優二叉樹簡稱:哈夫曼樹*/
/************************************************************************/
//哈夫曼樹結構
;typedefstruct{
unsignedintweight;//權重
unsignedintparent,lchild,rchild;//樹的雙親節點,和左右孩子
}HTNode,*HuffmanTree;
typedefchar**HuffmanCode;
//返回i個節點中權值最小的樹的根節點的序號,供select()調用
intMin(HuffmanTreeT,inti){
intj,flag;
unsignedintk=UINT_MAX;//%d-->UINT_MAX=-1,%u--->非常大的數
for(j=1;j<=i;j++)
if(T[j].weight<k&&T[j].parent==0)
k=T[j].weight,flag=j;//
T[flag].parent=1;//將parent標志為1避免二次查找
returnflag;//返回
}
voidSelect(HuffmanTreeT,inti,int&s1,int&s2){
//在i個節點中選取2個權值最小的樹的根節點序號,s1為序號較小的那個
intj;
s1=Min(T,i);
s2=Min(T,i);
if(s1>s2){
j=s1;
s1=s2;
s2=j;
}
}
//HuffmanCode代表的樹解碼二進制值
voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn){
//w存放n個字元的權值(均>0),構造哈夫曼樹HT,並求出n個字元的哈夫曼編碼HC
intm,i,s1,s2,start;
unsignedc,f;
char*cd;
//分配存儲空間
HuffmanTreep;
if(n<=1)
return;
//n個字元(葉子節點)有2n-1個樹節點,所以樹節點m
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0號元素未用
//這一步是給哈夫曼樹的葉子節點初始化
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{
(*p).weight=*w;
(*p).lchild=0;
(*p).rchild=0;
(*p).parent=0;
}
//這一步是給哈夫曼樹的非葉子節點初始化
for(;i<=m;++i,++p){
(*p).parent=0;
}
/************************************************************************/
/*做完准備工作後,開始建立哈夫曼樹
/************************************************************************/
for(i=n+1;i<=m;i++)
{
//在HT[1~i-1]中選擇parent=0且weigh最小的節點,其序號分別為s1,s2
Select(HT,i-1,s1,s2);//傳引用
HT[s1].parent=HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
/************************************************************************/
/*從葉子到根逆求每個葉子節點的哈夫曼編碼*/
/************************************************************************/
//分配n個字元編碼的頭指針向量,([0]不用)
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
cd=(char*)malloc(n*sizeof(char));//分配求編碼的工作空間
cd[n-1]='