霍夫曼解码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEAF 8 
#define MAX_NODE (2 * MAX_LEAF - 1)
#define MAX_CODE_LEN 105

typedef struct {
    int weight;
    int parent;
    int lchild;
    int rchild;
    char value;
} HTNode, *HuffmanTree;

char chars[MAX_LEAF] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
int weights[MAX_LEAF] = {7, 19, 2, 6, 32, 3, 21, 10};

void Select(HuffmanTree HT, int n, int *s1, int *s2) {
    int min1 = 1000000;
    int min2 = 1000000;
    *s1 = -1;
    *s2 = -1;

    for (int i = 0; i < n; i++) {
        if (HT[i].parent == -1) {
            if (HT[i].weight < min1) {
                min2 = min1;
                *s2 = *s1;
                min1 = HT[i].weight;
                *s1 = i;
            } else if (HT[i].weight < min2) {
                min2 = HT[i].weight;
                *s2 = i;
            }
        }
    }
}

void CreateHuffmanTree(HuffmanTree *HT, int n) {
    if (n <= 1) return;
    
    int m = 2 * n - 1;
    *HT = (HuffmanTree)malloc(m * sizeof(HTNode));

    for (int i = 0; i < n; i++) {
        (*HT)[i].weight = weights[i];
        (*HT)[i].parent = -1;
        (*HT)[i].lchild = -1;
        (*HT)[i].rchild = -1;
        (*HT)[i].value = chars[i];
    }

    for (int i = n; i < m; i++) {
        (*HT)[i].weight = 0;
        (*HT)[i].parent = -1;
        (*HT)[i].lchild = -1;
        (*HT)[i].rchild = -1;
        (*HT)[i].value = '#';
    }

    int s1, s2;
    for (int i = n; i < m; i++) {
        Select(*HT, i, &s1, &s2);

        (*HT)[i].weight = (*HT)[s1].weight + (*HT)[s2].weight;
        (*HT)[i].lchild = s1;
        (*HT)[i].rchild = s2;

        (*HT)[s1].parent = i;
        (*HT)[s2].parent = i;
    }
}

void Decode(HuffmanTree HT, int n, char *code) {
    int root = 2 * n - 2;
    int curr = root;
    int len = strlen(code);

    for (int i = 0; i < len; i++) {
        if (code[i] == '0') {
            curr = HT[curr].lchild;
        } else if (code[i] == '1') {
            curr = HT[curr].rchild;
        }

        if (HT[curr].lchild == -1 && HT[curr].rchild == -1) {
            printf("%c", HT[curr].value);
            curr = root; 
        }
    }
    printf("\n");
}

int main() {
    HuffmanTree HT;
    char inputCode[MAX_CODE_LEN];

    CreateHuffmanTree(&HT, MAX_LEAF);

    if (scanf("%s", inputCode) != 1) {
        return 0; 
    }

    Decode(HT, MAX_LEAF, inputCode);

    free(HT);

    return 0;
}

 

posted @ 2025-12-24 09:56  我不是青山  阅读(3)  评论(0)    收藏  举报