
我晕死,因为不会
//Tree.h #include<iostream> #include<stdlib.h> using namespace std;
const int MaxValue=10000; const int MaxBit=10; const int MaxN=10;
struct HaffNode{ int weight; int flag; int parent; int leftChild; int rightChild; }; struct Code{ int bit[MaxN]; int start; int weight; }; void Haffman(int weight[],int n,HaffNode haffTree[]){ int j,m1,m2,x1,x2; for(int i=0;i<2*n-1;i++){ if(i<n) haffTree[i].weight=weight[i]; else haffTree[i].weight=0; haffTree[i].flag=0; haffTree[i].parent=0; haffTree[i].leftChild=-1; haffTree[i].rightChild=-1; } for(i=0;i<n-1;i++){ m1=m2=MaxValue; x1=x2=0; for(j=0;j<n+i;j++){ if(haffTree[j].weight<m1&&haffTree[j].flag==0) { m2=m1; x2=x1; m1=haffTree[j].weight; x1=j; } else if(haffTree[j].weight<m2&&haffTree[j].flag==0){ m2=haffTree[j].weight; x2=j; } } haffTree[x1].parent=n+i; haffTree[x2].parent=n+i; haffTree[x1].flag=1; haffTree[x2].flag=1; haffTree[n+i].weight=haffTree[x1].weight+haffTree[x2].weight; haffTree[n+i].leftChild=x1; haffTree[n+i].rightChild=x2; } }
void HaffmanCode(HaffNode haffTree[],int n,Code haffCode[]) { Code *cd=new Code; int child,parent; for(int i=0;i<n;i++) { cd->start=n-1; cd->weight=haffTree[i].weight; child=i; parent=haffTree[child].parent; while(parent!=0) { if(haffTree[parent].leftChild==child) cd->bit[cd->start]=0; else cd->bit[cd->start]=1; cd->start--; child=parent; parent=haffTree[child].parent; } for(int j=cd->start+1;j<n;j++) haffCode[i].bit[j]=cd->bit[j]; haffCode[i].start=cd->start; haffCode[i].weight=cd->weight; } } #include "Tree.h"
void main(void) { int i,j,n=4; int weight[]={1,3,5,7}; HaffNode *myHaffTree=new HaffNode[2*n+1]; Code *myHaffCode=new Code[n]; if(n>MaxN) { cerr<<"定义的n越界!"<<endl; exit(1); } Haffman(weight,n,myHaffTree); HaffmanCode(myHaffTree,n,myHaffCode); for(i=0;i<n;i++) { cout<<"Weight="<<myHaffTree[i].weight<<'\t'<<"Code="; for(j=myHaffCode[i].start+1;j<n;j++) cout<<myHaffCode[i].bit[j]; cout<<endl; } }
2樓事用c++做的,我用c做勒一個: #include<stdio.h> #define MAXVALUE 10000 #define MAXLEAF 30 #define MAXNODE MAXLEAF*2-1 #define MAXBIT 10
typedef struct {char letter; int weight; int parent; int lchild; int rchild; }HNodeType;
typedef struct {char letter; int bit[MAXBIT]; int start; }HCodeType;
typedef struct {char s; int num; }Bowen;
void HuffmanTree(HNodeType HuffNode[],int n,Bowen a[]) {int i,j,m1,m2,x1,x2;
for(i=0;i<2*n-1;i++) {HuffNode[i].letter=NULL; HuffNode[i].weight=0; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1;} for(i=0;i<n;i++){HuffNode[i].weight=a[i].num;HuffNode[i].letter=a[i].s;} for(i=0;i<n-1;i++) {m1=m2=MAXVALUE; x1=x2=0; for(j=0;j<n+i;j++) { if(HuffNode[j].parent==-1&&HuffNode[j].weight<m1) {m2=m1;x2=x1; m1=HuffNode[j].weight; x1=j;} else if(HuffNode[j].parent==-1&&HuffNode[j].weight<m2) {m2=HuffNode[j].weight; x2=j;} } HuffNode[x1].parent=n+i;HuffNode[x2].parent=n+i; HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].lchild=x1; HuffNode[n+i].rchild=x2;}}
void HuffmanCode(int n,Bowen a[]) {HNodeType HuffNode[MAXNODE]; HCodeType HuffCode[MAXLEAF],cd; int i,j,c,p; HuffmanTree(HuffNode,n,a); for(i=0;i<n;i++) {cd.start=n-1; c=i; p=HuffNode[c].parent; while(p!=-1) {if(HuffNode[p].lchild==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p; p=HuffNode[c].parent;} for(j=cd.start+1;j<n;j++) HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start;} for(i=0;i<n;i++) {printf("%c ",HuffNode[i].letter); for(j=HuffCode[i].start+1;j<n;j++) printf("%d",HuffCode[i].bit[j]); printf("\n");} }
main() {Bowen data[30]; char s[100],*p; int i,count=0;clrscr(); printf("Input some letters:"); scanf("%s",&s); for(i=0;i<30;i++) {data[i].s=NULL; data[i].num=0;} p=s;
while(*p) {for(i=0;i<=count+1;i++) {if(data[i].s==NULL) {data[i].s=*p;data[i].num++;count++;break;} else if(data[i].s==*p) {data[i].num++;break;}} p++;} printf("\n"); printf("different letters:%d\n",count); for(i=0;i<count;i++) {printf("%c ",data[i].s); printf("weight:%d",data[i].num); printf("\n\n");} HuffmanCode(count,data); getch();}
[此贴子已经被作者于2005-4-23 18:45:50编辑过]