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

📄 ha217.c

📁 哈夫曼树 设计2进制前缀编码的方法如下. (1) 根据给定的n个字符以及相应的权值构造一棵最优二叉树 (2) 二叉树除了根结点以外,所有左边的分支标记 0 ,右边的分支标记为 1 (
💻 C
字号:
#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编码生成程序  >>>>\t\tby Haroldi.\n\n  请帮助评价一下思路及改善意见!\t多谢了:-)...\n\n\n\n"); 
    printf("\n输入代码数量:");    scanf("%d",&len); system("cls");printf("代码数量:%2d\n\n",len); 
    printf("输入代码及权值(e.g.:  \"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; 
} 
//================================================================================ 
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 + -