以下是将您提供的代码完全转换为C语言的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.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;
}
请注意,此代码是按照您提供的原始代码进行转换的,我并未进行任何优化或修改。希望对您有所帮助!
内容由零声教学AI助手提供,问题来源于学员提问