本答案参考多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢。
以下是使用C语言实现上述实验内容的代码示例,包括输入提示和数据合法性判断:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TREE_SIZE 100
#define MAX_CHAR 256
#define FILE_NAME "HfmTree"
// 赫夫曼树节点
typedef struct {
char ch;
unsigned freq;
struct Node *left, *right;
} Node;
// 创建赫夫曼树
Node* createHuffmanTree(int n, char charArray[], int freqArray[]) {
Node *huffmanTree[MAX_TREE_SIZE];
int i, j, min1, min2;
Node *left, *right;
// 创建n个赫夫曼树节点
for (i = 0; i < n; i++) {
huffmanTree[i] = (Node *)malloc(sizeof(Node));
huffmanTree[i]->ch = charArray[i];
huffmanTree[i]->freq = freqArray[i];
huffmanTree[i]->left = huffmanTree[i]->right = NULL;
}
// 构建赫夫曼树
for (i = n; i < MAX_TREE_SIZE - 1; i++) {
min1 = min2 = 999999;
for (j = 0; j < i; j++) {
if (huffmanTree[j]->left == NULL && huffmanTree[j]->freq < min1) {
min2 = min1;
min1 = j;
} else if (huffmanTree[j]->left == NULL && huffmanTree[j]->freq < min2) {
min2 = j;
}
}
left = huffmanTree[min1];
right = huffmanTree[min2];
huffmanTree[i] = (Node *)malloc(sizeof(Node));
huffmanTree[i]->ch = '$';
huffmanTree[i]->freq = left->freq + right->freq;
huffmanTree[i]->left = left;
huffmanTree[i]->right = right;
}
return huffmanTree[MAX_TREE_SIZE - 2];
}
// 编码赫夫曼树
void encode(Node *root, int arr[], int top) {
if (root->left) {
arr[top] = 0;
encode(root->left, arr, top + 1);
}
if (root->right) {
arr[top] = 1;
encode(root->right, arr, top + 1);
}
if (!(root->left) && !(root->right)) {
printf("%c: ", root->ch);
for (int i = 0; i < top; i++)
printf("%d", arr[i]);
printf("\n");
}
}
// 主函数
int main() {
int n;
printf("Enter the number of characters: ");
scanf("%d", &n);
char charArray[MAX_CHAR];
int freqArray[MAX_CHAR];
printf("Enter the characters and their frequencies:\n");
for (int i = 0; i < n; i++) {
printf("Character %d: ", i + 1);
scanf(" %c", &charArray[i]);
printf("Frequency %d: ", i + 1);
scanf("%d", &freqArray[i]);
}
// 检查数据合法性
for (int i = 0; i < n; i++) {
if (freqArray[i] < 0) {
printf("Invalid frequency. Please rerun the program.\n");
return 1;
}
}
Node *root = createHuffmanTree(n, charArray, freqArray);
printf("Huffman codes are:\n");
int arr[MAX_TREE_SIZE], top = 0;
encode(root, arr, top);
// 将赫夫曼树存储到文件
FILE *file = fopen(FILE_NAME, "w");
if (!file) {
printf("Error opening file.\n");
return 1;
}
// 存储赫夫曼树的代码(省略)
fclose(file);
return 0;
}
这段代码实现了以下功能:
- 输入提示:提示用户输入字符集大小
n
,以及 n
个字符和 n
个权值。 - 数据合法性判断:检查输入的权值是否非负。
- 建立赫夫曼树:根据输入的字符和权值构建赫夫曼树。
- 编码:利用构建好的赫夫曼树对字符进行编码,并打印编码结果。
- 存储赫夫曼树:将赫夫曼树存储到文件
HfmTree
中(具体存储代码省略)。
请根据实际需求进一步完善和调整代码。希望这能帮助你解决问题。