终于会哈夫曼编码了,那就把代码发上去了,这周我们课设了,感觉自己好颓废,过了几天糜烂的生活,自己也不知道怎么回事,有些事也就是那个样子,不要因为其他人影响自己的情绪,对自己好点,说到还要做到,不仅嘴上说说而已。我昨天一个人去,就一个人去的,一个人的感觉也不错嘛,想做什么就做什么,自己的情绪也好多了,就像我说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;
}