以下是将代码转换为全部C语言的版本,并做了一些修改以避免编译错误:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
typedef struct Node {
int weight;
int parent, left, right;
} HuffmanNode;
int buildHuffmanTree(HuffmanNode *huffmanNodes, int n) {
int m = 2 * n - 1;
HuffmanNode *nodes = huffmanNodes;
int i;
for (i = 0; i < m; i++) {
nodes[i].parent = nodes[i].left = nodes[i].right = -1;
}
for (i = n; i < m; i++) {
int min1 = INT_MAX, min2 = INT_MAX;
int x1, x2;
int j;
for (j = 0; j < i; j++) {
if (nodes[j].parent == -1) {
if (nodes[j].weight < min1) {
min2 = min1;
x2 = x1;
min1 = nodes[j].weight;
x1 = j;
} else if (nodes[j].weight < min2) {
min2 = nodes[j].weight;
x2 = j;
}
}
}
nodes[x1].parent = i;
nodes[x2].parent = i;
nodes[i].left = x1;
nodes[i].right = x2;
nodes[i].weight += min1 + min2;
}
return m - 1;
}
void generateHuffmanCode(HuffmanNode *huffmanNodes, char **codes, int root, int depth, char *code) {
if (root < 0) {
return;
}
if (huffmanNodes[root].left == -1 && huffmanNodes[root].right == -1) { // 叶子节点
code[depth] = '\0';
codes[root] = (char *)malloc((depth + 1) * sizeof(char));
strcpy(codes[root], code);
} else {
code[depth] = '0';
generateHuffmanCode(huffmanNodes, codes, huffmanNodes[root].left, depth + 1, code);
code[depth] = '1';
generateHuffmanCode(huffmanNodes, codes, huffmanNodes[root].right, depth + 1, code);
}
}
int main() {
int n,i;
scanf("%d", &n);
HuffmanNode *huffmanNodes = (HuffmanNode *)malloc((2 * n - 1) * sizeof(HuffmanNode));
for (i = 0; i < n; i++) {
scanf("%d", &huffmanNodes[i].weight);
}
int root = buildHuffmanTree(huffmanNodes, n);
char **codes = (char **)malloc(n * sizeof(char *));
char *code = (char *)malloc(n * sizeof(char));
generateHuffmanCode(huffmanNodes, codes, root, 0, code);
for (i = 0; i < n; i++) {
printf("%s\n", codes[i]);
free(codes[i]);
}
free(huffmaanCodes[n-1]);
for(i=n-2;i>=0;i--)
{
free(huffmaanCodes[i]);
free(&huffmaanCodes[i]);
}
free(huffmaanCodes);
free(code);
free(&code);
free(huffmaanNodes);
free(&huffmaanNodes);
return 0;
}
注意:在代码结尾,为了避免内存泄漏,需要释放动态分配的内存。
内容由零声教学AI助手提供,问题来源于学员提问