用c语言写一个用哈夫曼树的游戏
时间: 2024-05-09 08:15:33 浏览: 101
基于c语言实现哈夫曼树赫夫曼树
5星 · 资源好评率100%
好的,以下是一个简单的使用哈夫曼树的猜数字游戏的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//定义哈夫曼树节点
typedef struct TreeNode {
int value;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
//创建哈夫曼树
TreeNode* CreateHuffmanTree(int* freq, int n) {
//创建n个叶子节点
TreeNode** nodes = (TreeNode**)malloc(sizeof(TreeNode*) * n);
for (int i = 0; i < n; i++) {
nodes[i] = (TreeNode*)malloc(sizeof(TreeNode));
nodes[i]->value = freq[i];
nodes[i]->left = NULL;
nodes[i]->right = NULL;
}
//构建哈夫曼树
while (n > 1) {
//找到最小的两个节点
int min1 = 0, min2 = 1;
if (nodes[min1]->value > nodes[min2]->value) {
int tmp = min1;
min1 = min2;
min2 = tmp;
}
for (int i = 2; i < n; i++) {
if (nodes[i]->value < nodes[min1]->value) {
min2 = min1;
min1 = i;
} else if (nodes[i]->value < nodes[min2]->value) {
min2 = i;
}
}
//合并两个节点
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->value = nodes[min1]->value + nodes[min2]->value;
newNode->left = nodes[min1];
newNode->right = nodes[min2];
//将合并后的节点放回数组中
nodes[min1] = newNode;
nodes[min2] = nodes[n-1];
n--;
}
//返回哈夫曼树根节点
return nodes[0];
}
//猜数字游戏
void GuessNumber(TreeNode* root) {
printf("猜数字游戏开始了!\n");
printf("请猜一个从1到100之间的整数\n");
//生成1到100之间的随机整数
srand(time(NULL));
int answer = rand() % 100 + 1;
//根据哈夫曼树猜数字
TreeNode* curr = root;
while (curr->left != NULL && curr->right != NULL) {
if (curr->value > answer) {
curr = curr->left;
printf("猜小了,请再猜一个数字:\n");
} else {
curr = curr->right;
printf("猜大了,请再猜一个数字:\n");
}
}
//输出猜测结果
if (curr->value == answer) {
printf("恭喜你,猜对了!\n");
} else {
printf("很遗憾,你猜错了,正确答案是:%d\n", answer);
}
}
int main() {
//定义频率数组
int freq[] = {10, 15, 12, 3, 4, 13, 1, 7, 8, 4};
//创建哈夫曼树
TreeNode* root = CreateHuffmanTree(freq, 10);
//猜数字游戏
GuessNumber(root);
return 0;
}
```
这个程序首先定义了一个哈夫曼树节点结构体,并且定义了创建哈夫曼树和猜数字游戏的函数。在主函数中,我们定义了一个频率数组,然后使用该数组创建了一个哈夫曼树。接着调用猜数字游戏函数,根据哈夫曼树猜测一个1到100之间的整数。
阅读全文