实验六 huffman树的实现及应用

根据表格中各字符的出现概率生成一棵huffman树,并完成每个字符的huffman编码。


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define maxsize 100
struct huff
{
    int data; 
    int pa,lr,rc;
    char name;
};
struct stack
{
    int bit[maxsize];
    int top;
};
typedef struct stack Stack;
void init(Stack *s)
{
    s->top=-1;
}
bool Empty(Stack *s)
{
    if(s->top==-1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
bool full(Stack *s)
{
    if(s->top==maxsize-1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void Push(Stack *s,int element)
{
    if(!full(s))
    {
        s->top++;
        s->bit[s->top]=element;
    }
    else
    {
        printf("栈满\n");
    }
}

//出栈
void Pop(Stack *s)
{
    if(!Empty(s))
    {
        s->top--;
    }
    else
    {
        printf("栈空\n");
    }
}

//取栈顶元素
int Top(Stack *s)
{
    if(!Empty(s))
    {
        return s->bit[s->top];
    }
    else
    {
        printf("栈空\n");
    }
}
huff t[100];
void huffman(int n,int w[])
{
    int x1,x2,m1,m2,k;
    for(int i=1;i<=2*n-1;i++)
    {
        t[i].lr=0;
        t[i].pa=0;
        t[i].rc=0;
        if(i<=n)
        {
            t[i].data=w[i];
        }
        else
        t[i].data=0;
    }
    for(int i=1;i<n;i++)
    {
    
       m1=m2=100000;
    x1=x2=0;
    for(int j=1;j<(n+i);j++)
    { if((t[j].data<m1)&&(t[j].pa==0))
        {
            m2=m1;
            x2=x1;
            m1=t[j].data;  
            x1=j;
        }
    else if((t[j].data<m2)&&(t[j].pa==0))
    { 
        m2=t[j].data; x2=j; }
    }
    k=n+i;
    t[x1].pa=t[x2].pa=k;
    t[k].data=m1+m2;
    t[k].lr=x1;     
    t[k].rc=x2;
   }
}
void code(int n,huff c[])
{
    int f,x,y,z;
    char a='a';
    stack p;
    stack *s;
    s=&p;
    init(s);
    for(int i=1;i<=n;i++)
    {
        x=i;
        y=c[i].pa;
        while(c[y].pa!=0)
        {
            if(c[y].lr==x)
            {
                Push(s,0);
            }
            else if(c[y].rc==x)
            {
                Push(s,1);
            }
            x=y;
            y=c[y].pa;
        }
        if(c[y].pa==0)
        {
            if(c[y].lr==x)
            {
                Push(s,0);
            }
            else if(c[y].rc==x)
            {
                Push(s,1);
            }
        }
        printf("%c的编码为:",a);
        a++;
        while(s->top!=-1)
        {
            f=Top(s);
            Pop(s);
            printf("%d",f);
        }
        printf("\n");
    }
}
int main()
{
    int n, w[30];
    char c='a';
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d",&w[i]);
    huffman(n,w);
    for(int i=1;i<=n;i++)
    {
        t[i].name=c;
        c++;
    }
    for(int i=1;i<=2*n-1;i++)
    {
        printf("%c %6d %d %d %d\n",t[i].name,t[i].data,t[i].lr,t[i].pa,t[i].rc);
    }
   code(n,t); 
}
/*26
856
139
297
378
1304
289
199
528
627
12
42
339
249
707
797
199
12
677
607
1045
249
92
149
17
199
8*/

 

posted @ 2018-01-02 10:18  Hztiger  阅读(508)  评论(0编辑  收藏  举报