哈夫曼编码设计(C)


前言

大二,刚刚开始学数据结构与算法,写得不好。。。。


哈夫曼编码设计

现要求输入8个字符{a,b,c,d,e,f,g,h}对应的权值(大于0的整数),然后设计哈夫曼编码实现输入对应8个字符组成的一串字符(字符串长度不超过100),然后输出字符串对应的哈夫曼编码。(提示:哈夫曼树的每个分支左分支设为0,右分支设为1)。
例如:
输入:1 2 3 4 5 6 7 8
acdb
输出:11110111010011111

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

#define MAXSIZE 100
#define inf 0x3f3f3f3f

typedef struct {
    int bit[MAXSIZE];
    int start;
} HC;
typedef struct {
    int w;
    int p;
    int l;
    int r;
    char name;
} HT;
HT T[MAXSIZE];
HC C[MAXSIZE];

void HuffmanTree(HT T[MAXSIZE], int n) {
    int i, j, m1, m2, x1, x2;
    for (i = 0; i < 2 * n - 1; i++) {
        T[i].w = 0;//权值
        T[i].p = -1;
        T[i].l = -1;
        T[i].r = -1;
    }
    for (i = 0; i < n; i++) {
        T[i].name = 'a' + i;
        scanf("%d", &T[i].w);
    }

    for (i = 0; i < n - 1; i++) {
        m1 = m2 = inf;
        x1 = x2 = -1;
        for (j = 0; j < n + i; j++) {
            if (T[j].w < m1 && T[j].p == -1) {
                m2 = m1;
                x2 = x1;
                m1 = T[j].w;
                x1 = j;
            } else if (T[j].w < m2 && T[j].p == -1) {
                m2 = T[j].w;
                x2 = j;
            }
        }
        T[x1].p = T[x2].p = n + i;
        T[n + i].w = T[x1].w + T[x2].w;
        T[n + i].l = x1;
        T[n + i].r = x2;
    }
}

int main() {
    HC cd;
    int i, j, c, p,k, n = 8;
    HuffmanTree(T, n);
    for (i = 0; i < n; i++) {
        cd.start = n - 1;
        c = i;
        p = T[c].p;
        while (p != -1) {
            if (T[p].l == c)
                cd.bit[cd.start] = 0;
            else
                cd.bit[cd.start] = 1;
            cd.start--;
            c = p;
            p = T[c].p;
        }
        for (j = cd.start + 1; j < n; j++) { C[i].bit[j] = cd.bit[j]; }
        C[i].start = cd.start;
    }
    char str[MAXSIZE];
    scanf("%s", str);
    for (k = 0; k < strlen(str); ++k) {
        char temp = str[k];
        for (i = 0; i < n; i++) {
            if (T[i].name != temp) {
                continue;
            }
            for (j = C[i].start + 1; j < n; j++) {
                printf("%d", C[i].bit[j]);
            }
        }
    }
    return 0;
}

总结

就离谱 算法也是很难。