2401_85653888 2024-11-26 17:05 采纳率: 0%
浏览 8

1.输入信息时进行提示 2.输入数据的合法性判

实验内容】
1.初始化,从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫量树,并进行存储到文件HfmTree中;
2.编码,利用构建好的赫夫量树,对文件中的正文进行编码,然后将结果保存到文件CodeFile中;
3.编译,利用已经构建好的赫夫量树将文件中的代码进行译码,结果进行保存到文件TextFile中;
4.打印代码文件,将文件CodeFile文件以紧凑格式显示在终端上,每行50个代码,同时将此字符形式的编码写入到文件CodePrint中;
5.打印赫夫量树,将已经在内存中的赫夫量树以直观的方式显示在终端上。


- 


  • 写回答

1条回答 默认 最新

  • JavaPub-rodert 博客专家认证 2024-12-01 12:38
    关注

    本答案参考多次询问 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;
    }
    

    这段代码实现了以下功能:

    1. 输入提示:提示用户输入字符集大小 n,以及 n 个字符和 n 个权值。
    2. 数据合法性判断:检查输入的权值是否非负。
    3. 建立赫夫曼树:根据输入的字符和权值构建赫夫曼树。
    4. 编码:利用构建好的赫夫曼树对字符进行编码,并打印编码结果。
    5. 存储赫夫曼树:将赫夫曼树存储到文件 HfmTree 中(具体存储代码省略)。

    请根据实际需求进一步完善和调整代码。希望这能帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月26日

悬赏问题

  • ¥15 zigbee终端设备入网失败
  • ¥15 金融监管系统怎么对7+4机构进行监管的
  • ¥15 硬件IIC从模式的数据发送,中断数据的接收,不能用HAL库(按照时序图)
  • ¥20 QAxWidget上显示一个word文档后,如何直接在该QAxWidget上修改和保存word文档
  • ¥15 Simulink仿真报错,请问如何解决
  • ¥20 宝塔面板无法添加Node项目,一直处于正在添加脚本页面
  • ¥50 Dkeil5 CT107D单片机的程序编写
  • ¥30 Ubuntu20.04中PVN3D复现过程交叉编译问题
  • ¥60 不懂得怎么运行下载来的代码
  • ¥15 CST导出3D模型图为什么和软件显示不一样?