建立HUFFMAN树,并进行编码(编码使用无栈非递归方法)

//ps:在进行哈夫曼编码的时候,用了非递归和非栈的情况
//利用了课本上的思想,但是不拘泥于其思想,更容易理解

#include <malloc.h>
#include <stdio.h>


#define SIZE 5


typedef struct
{
int Parent;//双亲的索引
int value;//数据域数值
int left,right;//左右孩子的索引
}* Huffman,Node;


void Select(Huffman &Huff,int start,int end,int &s1,int &s2)
{
//s1<s2<...
int Miner=0x7FFFFFFF;
int Minest=0x7FFFFFFF;
int x_Miner=-1;
int x_Minest=-1;
for(int i=start;i<=end;i++)
{
   if(Huff[i].value<Minest&&0==Huff[i].Parent)
   {
    x_Miner=x_Minest;
    Miner=Minest;
    Minest=Huff[i].value;
    x_Minest=i;
   }
   else
   {
    if(Huff[i].value<Miner&&0==Huff[i].Parent)
    {
     Miner=Huff[i].value;
     x_Miner=i;
    }
   }
}
s1=x_Minest;
s2=x_Miner;
return ;

}


//先将Huffman的数组建好
void HuffmanCoding(int (&HT)[SIZE])
{
int s1(0),s2(0);
int NodeNumber=2*SIZE-1;

Huffman HuffmanArray=(Huffman)malloc(NodeNumber*sizeof(Node));//哈夫曼数组已经编好了

for(int i=0;i<SIZE;i++)
{
   // HuffmanArray[i]={0,HT[i],0,0};//将Huff中的数,复制到HuffmanArray中
   HuffmanArray[i].value=HT[i];
   HuffmanArray[i].Parent=0;
   HuffmanArray[i].left=-1;
   HuffmanArray[i].right=-1;
  
}
for(int i_c=i;i_c<NodeNumber;i_c++)
{
   HuffmanArray[i_c].Parent=0;//把其余节点的Parent都置为0
}
//开始建立节点了
for(;i<NodeNumber;i++)
{
   Select(HuffmanArray,0,i-1,s1,s2);//从0节点到i-1节点找两个最小数,返回
   HuffmanArray[i].value=HuffmanArray[s1].value+HuffmanArray[s2].value;
   HuffmanArray[i].left=s1;
   HuffmanArray[i].right=s2;
   HuffmanArray[s1].Parent=i;
   HuffmanArray[s2].Parent=i;
}
//HuffmanArray[i-1].Parent=0;
//建好节点后,就开始编码了吧

//编码空间最大为:n-1


char * charArray=(char *)malloc((SIZE-1)*sizeof(char));

// Huffman p=(Huffman)malloc(SIZE*sizeof(Node));
int n=0;
Huffman p=&HuffmanArray[n];

for(i=0;i<NodeNumber;i++)
   p[i].value = 0;
p=&p[--i];

int count = 0;
while(count < SIZE)
{
   if(p->value==0)
   {
    p->value=1;//说明遍历过了左边
    if(p->left>=0)
    {
     p=&HuffmanArray[p->left];
     charArray[n++]='0';
    }
    else
    {
     printf("第%d个节点的编码:\n",p-HuffmanArray+1);
     for(int i_i=0;i_i<n;i_i++)
     {
      printf("->%c",charArray[i_i]);
     }
     count++;
     printf("\n");
     n--;
     p=&HuffmanArray[p->Parent];//上溯了
    }
   }
   else if(p->value==1)//说明遍历过了右边
   {
    p->value=2;
    if(p->right>=0)
    {
     p=&HuffmanArray[p->right];
     charArray[n++]='1';
    }//end if 如果p->right=0,那么开始上溯
    else
    {
     //如果p->right==0,那么肯定不是二叉树了,哈哈
    
    
    }
   }
   else if(p->value==2)
   {
   // p->value=0;
    n--;
    p=&HuffmanArray[p->Parent];
  
   
   }


  
}
}



void main()
{
int a[SIZE]={0};
for(int i=0;i<SIZE;i++)
{
   a[i]=i+1;
}
//int * b=a;
HuffmanCoding(a);
}

评论

此博客中的热门博文

Linux/ARM Page Table Entry 属性设置分析

由RFE指令引发的一串故事

提交了30次才AC ---【附】POJ 2488解题报告