终于会哈夫曼编码了,那就把代码发上去了,这周我们课设了,感觉自己好颓废,过了几天糜烂的生活,自己也不知道怎么回事,有些事也就是那个样子,不要因为其他人影响自己的情绪,对自己好点,说到还要做到,不仅嘴上说说而已。我昨天一个人去,就一个人去的,一个人的感觉也不错嘛,想做什么就做什么,自己的情绪也好多了,就像我说Low·魂淡想怎样就怎样痛怎样伤怎样,任何时候都不要让自己的心累。别笑我,幼稚的轻狂,
其实这次自己做了3个调用函数,一个创建,一个输出,一个标记最小值,注意有个for语句空循环;
//#include <iostream> #include<stdio.h> #include<stdlib.h> typedef struct node{ char data; int weight; int left,right; int parent; }Huffman; void select(Huffman *G,int n,int *s1,int *s2){ int i; printf("输出前%d个结点的数据,左右孩子,双亲 ,权值:\n",n); for(i=0;i<n;i++) { printf("%3c%3d%3d%3d%3d\n",G[i].data,G[i].left,G[i].right,G[i].parent,G[i].weight); } for(*s1=0;*s1<n;(*s1)++) { if(G[*s1].parent==-1) { break; } } for(*s2=*s1+1;*s2<n&&G[*s2].parent!=-1;*s2=*s2+1); for(i=*s2;i<n;i++){ if(G[i].parent==-1) { if(G[i].weight<G[*s1].weight) { *s2=*s1; *s1=i; } else if(G[i].weight<G[*s2].weight) { *s2=i; } } } } void CreateHuffman(Huffman *G,int n){ int i; int s1,s2; for(i=0;i<n;i++){ fflush(stdin); printf("请你输入第%d个节点的数据和权值: ",i+1); scanf("%c%d",&G[i].data,&G[i].weight); G[i].parent=-1; G[i].left=-1; G[i].right=-1; } for(i=n;i<2*n-1;i++){ select(G,i,&s1,&s2); G[i].weight=G[s1].weight+G[s2].weight; G[i].left=s1; G[i].right=s2; G[i].parent=-1; G[i].data=' '; G[s2].parent=G[s1].parent=i; } } void PrintHuffNode(Huffman *G,int n){ int i,k,start=0,j; int temp; char ch; char r[10]={'\0'}; for(i=0;i<n;i++) { j=i; ch=G[j].data; start=0; while(G[j].parent!=-1){ temp=G[j].parent; if(G[temp].left==i){ r[start++]='0'; } else{ r[start++]='1'; } j=temp; } printf("\n输出符号%c的哈弗曼编码为:",ch); for(k=start-1;k>=0;k--) { printf("%c",r[k]); r[k]='\0'; } printf("\n"); } } int main(int argc, char** argv) { Huffman *G; int n; char a[50]={'\0'}; printf("please input vertxe number: "); scanf("%d",&n); G=(Huffman *)malloc((2*n-1)*sizeof(Huffman)); CreateHuffman(G,n); PrintHuffNode(G,n); return 0; }