⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffman.txt

📁 Huffman编码的源代码..很不错的说
💻 TXT
字号:
/Huffman编码的实现,仅供学习、交流
//2009.3.23


#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50

typedef struct{
    char c;                    //输入的元素;
    int w;                     //元素权值;
    char code[MaxSize];        //元素的Huffman编码;
    }HuffCode[MaxSize];

typedef struct{
    int Weight;                //权值;
    int LChild,RChild,Parent;
    }HTNode,HuffTree[MaxSize];

//====================================================================
void HuffmanTree(HuffTree HT,int length,HuffCode hc);        //生成Huffman树;
void SelectHTNode(HuffTree HT,int n,int *min1,int *min2);    //查找最小和次小序号;
void HuffmanCode(HuffTree HT,int len,HuffCode hc);           //生成Huffman编码;
//====================================================================

int main(void)
{
    HuffTree HT;       //Huffman树;
    HuffCode HC;       //Huffman编码;
    int i,len;
    
	printf("——Huffman编码的实现——\n\n请同学们理解Huffman编码的思想和程序实现的方法\n\n");
    
	printf("\n输入代码数量:"); 
	scanf("%d",&len); system("cls");printf("代码数量:%2d\n\n",len);
    
	printf("输入代码及权值(例如: \"a16[回车]\" ):\n");
    for(i=1;i <= len;i++)
    {
        while(getchar() != '\n')    NULL;
        printf("No.%2d:  ",i);
        HC[i].c = getchar();
        scanf("%d",&HC[i].w);
    }
    HuffmanTree(HT,len,HC);
    HuffmanCode(HT,len,HC);

    printf("\n输出Huffman编码:\n");
    for(i = 1;i<=len;i++)
    {
        printf("\n %c :",HC[i].c);
        puts(HC[i].code);
    }
//测试Huffman树结构;
    printf("\n\n输出Huffman树结构:");system("pause");
    printf("\nHT[i]:\t权值\t双亲\t左孩子\t右孩子\n");
    for(i = 1;i<2*len;i++)
    {
        if(i <= len)
			printf("(%c)",HC[i].c);
            printf("%2d:\t %2d;\t%2d,\t %2d,\t %2d.\n",\
                i,HT[i].Weight,HT[i].Parent,HT[i].LChild,HT[i].RChild);
    }
    return 0;
}

//====================================================================

//生成Huffman树
void HuffmanTree(HuffTree HT,int length,HuffCode hc)       //Huffman树初始化;
{
    int i,min1,min2;
    HT[0].Weight = 65535;
    for(i = 1;i <= length;i++)
    {
        HT[i].Weight = hc[i].w;
        HT[i].LChild = HT[i].RChild = HT[i].Parent = -1;
    }
    for(;i < 2*length;i++)            //i初值 = length+1;
    {
        HT[i].LChild = HT[i].RChild = HT[i].Parent = -1;
    }

    for(i = length+1;i < 2*length;i++)
    {
        SelectHTNode(HT,i,&min1,&min2);
        HT[min1].Parent = i;
        HT[min2].Parent = i;
        HT[i].LChild = min1;
        HT[i].RChild = min2;
        HT[i].Weight = HT[min1].Weight + HT[min2].Weight;
    }
}

//====================================================================

void SelectHTNode(HuffTree HT,int n,int *min1,int *min2)    //查找最小和次小序号;
{
    int i;
    *min1 = *min2 = 0;
    for(i = 1;i < n;i++)
    {
        if(HT[i].Parent == -1)
        {
            if(HT[*min1].Weight >= HT[i].Weight)
            {
                *min2 = *min1;
                *min1 = i;
            }
            else if(HT[*min2].Weight > HT[i].Weight)    *min2 = i;
        }
    }
}

//==================================================================

void HuffmanCode(HuffTree HT,int len,HuffCode hc)         //生成Huffman编码;
{
    int i,j,tc,Stack[MaxSize],top = -1;
    char flag[MaxSize];
    HTNode th;
    for(i = 1;i <= len;i++)
    {
        top = -1;                        //栈初始化;
        j = 0;                            //hc[i].code串首位置偏移;
        th = HT[i];                        //当前结点th;
        tc = i;                            //当前结点标记tc;
        while(th.Parent != -1)
        {        //当前结点th双亲P入栈,由P的孩子是th,确定flag;确定下次结点标记tc;
            Stack[++top] = th.Parent;
            if(HT[th.Parent].LChild == tc)    {flag[top] = 'L'; tc = th.Parent;}
            if(HT[th.Parent].RChild == tc)    {flag[top] = 'R'; tc = th.Parent;}
            th = HT[Stack[top]];        //下一结点;
        }                               
        while(top != -1)
        {
            if(flag[top] == 'L')    hc[i].code[j++] ='0';
            else                    hc[i].code[j++] ='1';
            Stack[top--];                //出栈;
        }
        hc[i].code[j] ='\0';            //当前串结束;
    }         
}
//===================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -