(1)

#include <stdio.h> #include <stdlib.h> #include <string.h>

#define MAX_CHAR 26

typedef struct node { char ch; // 字符 int freq; // 频率 char code[MAX_CHAR]; // 编码 struct node *left, *right; } node;

// 统计字符出现频率 void calc_freq(char *str, int *freq) { int len = strlen(str); for (int i = 0; i < len; i++) { if (str[i] >= 'a' && str[i] <= 'z') { freq[str[i] - 'a']++; } else if (str[i] >= 'A' && str[i] <= 'Z') { freq[str[i] - 'A']++; } } }

// 创建节点 node *create_node(char ch, int freq) { node *p = (node *)malloc(sizeof(node)); p->ch = ch; p->freq = freq; p->left = p->right = NULL; return p; }

// 创建哈夫曼树 node *create_huffman_tree(int *freq) { node *p, *q, *root = NULL; int min1, min2;

// 创建叶子节点
node *leaves[MAX_CHAR];
int n = 0;
for (int i = 0; i < MAX_CHAR; i++) {
    if (freq[i] > 0) {
        leaves[n++] = create_node(i + 'a', freq[i]);
    }
}

// 构建哈夫曼树
while (n > 1) {
    // 找出权值最小的两个节点
    min1 = min2 = 0;
    for (int i = 1; i < n; i++) {
        if (leaves[i]->freq < leaves[min1]->freq) {
            min2 = min1;
            min1 = i;
        }
        else if (leaves[i]->freq < leaves[min2]->freq) {
            min2 = i;
        }
    }
    // 合并两个节点
    p = leaves[min1];
    q = leaves[min2];
    leaves[min1] = create_node(0, p->freq + q->freq);
    leaves[min1]->left = p;
    leaves[min1]->right = q;
    // 删除已合并的节点
    leaves[min2] = leaves[--n];
}
root = leaves[0];

return root;

}

// 编码 void encode(node *root, char *code, int len) { if (root == NULL) { return; } if (root->left == NULL && root->right == NULL) { memcpy(root->code, code, len); root->code[len] = '\0'; return; } code[len] = '0'; encode(root->left, code, len + 1); code[len] = '1'; encode(root->right, code, len + 1); }

// 输出结果 void print_result(int *freq, node *root) { printf("字符 频率 编码\n"); for (int i = 0; i < MAX_CHAR; i++) { if (freq[i] > 0) { printf("%c %d %s\n", i + 'a', freq[i], root[i].code); } } }

int main() { char str[1000]; int freq[MAX_CHAR] = {0};

printf("请输入一段英文句子:\n");
fgets(str, sizeof(str), stdin);

calc_freq(str, freq);

node *root = create_huffman_tree(freq);

char code[MAX_CHAR] = {0};
encode(root, code, 0);

print_result(freq, root);

return 0;

}

(2)

// 将编码转换为字符 char decode(char *code, node *root) { node *p = root; for (int i = 0; i < strlen(code); i++) { if (code[i] == '0') { p = p->left; } else if (code[i] == '1') { p = p->right; } if (p->left == NULL && p->right == NULL) { return p->ch; } } return '\0'; }

int main() { char str[1000]; int freq[MAX_CHAR] = {0};

printf("请输入一段英文句子:\n");
fgets(str, sizeof(str), stdin);

calc_freq(str, freq);

node *root = create_huffman_tree(freq);

char code[MAX_CHAR] = {0};
encode(root, code, 0);

printf("编码结果:\n");
for (int i = 0; i < strlen(str); i++) {
    if (str[i] >= 'a' && str[i] <= 'z') {
        printf("%s", root[str[i] - 'a'].code);
    }
    else if (str[i] >= 'A' && str[i] <= 'Z') {
        printf("%s", root[str[i] - 'A'].code);
    }
}
printf("\n");

printf("译码结果:\n");
char code2[MAX_CHAR] = {0};
int len = 0;
for (int i = 0; i < strlen(str); i++) {
    if (str[i] == '0' || str[i] == '1') {
        code2[len++] = str[i];
        code2[len] = '\0';
        char ch = decode(code2, root);
        if (ch != '\0') {
            printf("%c", ch);
            len = 0;
        }
    }
}
printf("\n");

return 0;
编写C语言代码:根据给定的n个字符及其权值设计各字符的哈夫曼编码1键盘输入一段英文句子统计句子中出现的英文字母数目不含标点符号以及各个英文字母的出现次数及频率。然后设计各个英文字母的哈夫曼编码的码字。 2 选定一个英文字母序列根据上述哈夫曼编码方法得到码字序列后再对码字序列译码

原文地址: https://www.cveoy.top/t/topic/hbWp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录