哈夫曼编码设计(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;
}