ZBLOG

#include #include typedef struct Node { int weight; int parent, left, right; } HuffmanNode; int buildHuffmanTree(HuffmanNode *huffmanNodes, int n) { int m = 2 * n - 1; HuffmanNode *nodes = huffmanNodes; i...

以下是将代码转换为全部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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9833

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?