乱七八糟的笔记(自环)

博客主要提及了自环这一内容,但未给出更多详细信息。自环可能是信息技术领域中某个特定概念。
自环

自环

### 重写主函数以验证输入数据的有效性 以下代码展示了如何在C语言中重写哈夫曼树程序的主函数,确保输入数据的有效性。通过增加输入验证逻辑,防止无效或乱七八糟的数据影响程序运行。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 定义二叉树节点结构 typedef struct TreeNode { int freq; // 权值 char ch; // 字符(若为内部节点,则用 '#' 表示) struct TreeNode *left, *right; // 左右子树指针 } TreeNode; // 创建新节点 TreeNode* createNode(int freq, char ch) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); newNode->freq = freq; newNode->ch = ch; newNode->left = newNode->right = NULL; return newNode; } // 按权值从小到大排序节点数组 void sortNodes(TreeNode** nodes, int size) { for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i - 1; j++) { if (nodes[j]->freq > nodes[j + 1]->freq) { TreeNode* temp = nodes[j]; nodes[j] = nodes[j + 1]; nodes[j + 1] = temp; } } } } // 构造哈夫曼树 TreeNode* buildHuffmanTree(int freq[], int size) { TreeNode* left, *right, *top; TreeNode** nodes = (TreeNode**)malloc(size * sizeof(TreeNode*)); // 初始化叶子节点 for (int i = 0; i < size; i++) { nodes[i] = createNode(freq[i], 'a' + i); // 假设字符从 'a' 开始 } while (size != 1) { sortNodes(nodes, size); // 取出权值最小的两个节点 left = nodes[0]; right = nodes[1]; // 创建新的父节点 top = createNode(left->freq + right->freq, '#'); top->left = left; top->right = right; // 替换前两个节点为父节点 nodes[0] = top; for (int i = 1; i < size - 1; i++) { nodes[i] = nodes[i + 1]; } size--; } TreeNode* root = nodes[0]; free(nodes); return root; } // 中序遍历哈夫曼树 void inorderTraversal(TreeNode* root) { if (root == NULL) return; inorderTraversal(root->left); if (root->ch != '#') printf("%c(%d) ", root->ch, root->freq); inorderTraversal(root->right); } // 主函数:增加输入验证逻辑 int main() { int n; printf("请输入词频个数(不超过10):"); if (scanf("%d", &n) != 1 || n <= 0 || n > 10) { // 验证输入是否合法 printf("输入错误!词频个数必须是1到10之间的整数。\n"); return 1; } int freq[n]; printf("请输入%d个词频(正整数):", n); for (int i = 0; i < n; i++) { if (scanf("%d", &freq[i]) != 1 || freq[i] <= 0) { // 验证每个词频是否为正整数 printf("输入错误!词频必须是正整数。\n"); return 1; } } // 构造哈夫曼树 TreeNode* root = buildHuffmanTree(freq, n); // 输出中序遍历结果 printf("哈夫曼树的中序遍历序列:\n"); inorderTraversal(root); printf("\n"); return 0; } ``` #### 代码说明 - **输入验证**:在主函数中增加了对词频个数和词频值的验证逻辑,确保输入数据有效[^2]。 - **错误处理**:如果用户输入无效数据,程序会输出错误信息并终止运行。 - **构造哈夫曼树**:`buildHuffmanTree` 函数通过不断合并权值最小的两个节点来构建哈夫曼树,确保权值较小者作为左子树,相同权值按先后顺序分左右[^3]。 - **中序遍历**:`inorderTraversal` 函数递归地输出哈夫曼树的中序序列。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值