以下是将给定代码改为完全符合C语言规范,并且能够在ACM OJ平台上运行的版本:
#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(huffmanNodes);
free(codes);
free(code);
return 0;
}
请注意,此代码已针对C语言进行了修正,并添加了所需的标准库头文件。在ACM OJ平台上运行时,确保编译器支持C语言标准和所需的库函数。
内容由零声教学AI助手提供,问题来源于学员提问




