-->
当前位置:首页 > 题库 > 正文内容

程序填空题:哈夫曼编码

Luz4年前 (2021-06-19)题库1398
本题要求根据输入创建哈夫曼编码。

输入4 个字符以及该字符对应的权值(如:a,10)

输出每个节点的哈夫曼编码。 

输入样例为:
```
a,10
b,9
c,12
d,8
```
输出样例为:
```
a:10
b:00
c:11
d:01
```

```c++
#include
#include
#include

#define N 4         //带权值的叶子节点数或者是需要编码的字符数
#define M 2*N-1     //n个叶子节点构造的哈夫曼树有2n-1个结点
#define MAX 10000

typedef char TelemType;
typedef struct{
    unsigned int weight;
    unsigned int parent,lchild,rchild;
} HTNode;
typedef HTNode HuffmanTree[M+1];
typedef char * HuffmanCode[N+1];

void createHuffmanTree(HuffmanTree HT, int *w, int n);
void select(HuffmanTree HT, int k, int *s1, int *s2);
void encodingHuffmanCode(HuffmanTree HT, HuffmanCode HC);
void printHuffmanCoding(HuffmanCode HC, char ch[]);

int main(){
    HuffmanTree HT;
    TelemType ch[N+1];
    int w[N+1];
    for(int i = 1; i <= N; i++){
        scanf("%c,%d", &ch[i], &w[i]);
        getchar();}
    createHuffmanTree(HT, w, N);    HuffmanCode HC;
    encodingHuffmanCode(HT, HC);    printHuffmanCoding(HC, ch);
    return 0;}

void createHuffmanTree(HuffmanTree HT, int *w, int n){
    if(n<=1)
        return;
    for(int i=1; i<=n; i++){
        HT[i].weight=;
        HT[i].lchild=;
        HT[i].parent=;
        HT[i].rchild=; }
    for(int i=; i<=M; i++){
        HT[i].weight=0;
        HT[i].lchild=0;
        HT[i].parent=0;
        HT[i].rchild=0; }
    for (int i=n+1; i<=M; i++){
        int s1,s2;
        select(HT,i-1,&s1,&s2);
        HT[s1].parent=i;
        HT[s2].parent=i;
        HT[i].lchild=;
        HT[i].rchild=;
        HT[i].weight=; }}

void select(HuffmanTree HT, int k, int *s1, int *s2){
    unsigned int tmp=MAX,tmpi=0;
    for (int i=1; i<=k; i++){
        if(!HT[i].parent){
            if(tmp>HT[i].weight){
                tmp=HT[i].weight;
                tmpi=i;}}}
    *s1=tmpi;
    tmp=MAX;
    tmpi=0;
    for(int i=1; i<=k; i++){
        if((!HT[i].parent)&&i!=*s1){
            if(tmp>HT[i].weight){
                tmp=HT[i].weight;
                tmpi=i;}}}
    if(tmpi<*s1){
        *s2=*s1;
        *s1=tmpi;}
    else
        *s2=tmpi;}

void encodingHuffmanCode(HuffmanTree HT, HuffmanCode HC){
    char tmp[N];
    tmp[N-1]=;
    int start,c,f;
    for (int i=1; i<=N; i++){
        start=N-1;
        for(c=i,f=; f!=0; c=f,f=){
            if(HT[f].lchild==c)
                tmp[--start]=;
            else
                tmp[--start]=; }
        HC[i]=(char*)malloc((N-start)*sizeof(char));
        strcpy (HC[i],&tmp[start]);}}

void printHuffmanCoding(HuffmanCode HC, char ch[]){
    for(int i=1; i<=N; i++){
        printf("%c:%s\n",ch[i],HC[i]);}}
```






答案: 第1空:w[i] 第2空:0 第3空:0 第4空:0 第5空:n+1 第6空:s1 第7空:s2 第8空:HT[s1].weight+HT[s2].weight 第9空:'\0' 第10空:HT[i].parent 第11空:HT[f].parent 第12空:'0' 第13空:'1'


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。