写一个c程序,采用链式存储结构实现Huffman树的建立,给定6个结点的权重分别为a:3、b:2、c:1、d:5、e:6、f:4; 程序功能: 做一个菜单 1.Huffman树的建立; 2.Huffman树的中序遍历; 3.退出程序 遍历输出结果应为:c b a f d e
时间: 2024-03-24 14:37:46 浏览: 89
一个huffman树的程序
下面是一个使用链式存储结构实现Huffman树建立的C程序,可以满足你的需求。程序中使用了菜单功能,可以让用户选择不同的操作。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义Huffman树结点结构体
typedef struct node {
char data; // 结点数据
int weight; // 结点权重
struct node *left; // 左子树指针
struct node *right; // 右子树指针
} HuffmanNode;
// 定义链表结点结构体
typedef struct list_node {
HuffmanNode *data; // 数据指针
struct list_node *next; // 下一个结点的指针
} ListNode;
// 定义链表结构体
typedef struct list {
ListNode *head; // 链表头指针
int size; // 链表大小
} List;
// 创建一个新的链表结点
ListNode *newListNode(HuffmanNode *data) {
ListNode *node = (ListNode *)malloc(sizeof(ListNode));
node->data = data;
node->next = NULL;
return node;
}
// 创建一个新的Huffman树结点
HuffmanNode *newHuffmanNode(char data, int weight) {
HuffmanNode *node = (HuffmanNode *)malloc(sizeof(HuffmanNode));
node->data = data;
node->weight = weight;
node->left = NULL;
node->right = NULL;
return node;
}
// 创建一个新的链表
List *newList() {
List *list = (List *)malloc(sizeof(List));
list->head = NULL;
list->size = 0;
return list;
}
// 将结点插入到链表尾部
void insertList(List *list, ListNode *node) {
if (list->head == NULL) {
list->head = node;
} else {
ListNode *p = list->head;
while (p->next != NULL) {
p = p->next;
}
p->next = node;
}
list->size++;
}
// 从链表中删除指定结点
void removeListNode(List *list, ListNode *node) {
if (list->head == node) {
list->head = node->next;
} else {
ListNode *p = list->head;
while (p && p->next != node) {
p = p->next;
}
if (p) {
p->next = node->next;
}
}
list->size--;
}
// 销毁链表
void destroyList(List *list) {
ListNode *p = list->head;
while (p) {
ListNode *next = p->next;
free(p->data);
free(p);
p = next;
}
free(list);
}
// 打印Huffman树的中序遍历结果
void printHuffmanTree(HuffmanNode *root) {
if (root) {
printHuffmanTree(root->left);
printf("%c ", root->data);
printHuffmanTree(root->right);
}
}
// 构建Huffman树
HuffmanNode *buildHuffmanTree(List *list) {
// 循环,直到只剩下一个结点
while (list->size > 1) {
// 找到链表中的最小结点
ListNode *min1 = list->head;
ListNode *p = list->head->next;
while (p) {
if (p->data->weight < min1->data->weight) {
min1 = p;
}
p = p->next;
}
// 从链表中删除最小结点
removeListNode(list, min1);
// 找到链表中的次小结点
ListNode *min2 = list->head;
p = list->head->next;
while (p) {
if (p->data->weight < min2->data->weight) {
min2 = p;
}
p = p->next;
}
// 从链表中删除次小结点
removeListNode(list, min2);
// 创建新的Huffman树结点,并将最小结点和次小结点作为它的左右子树
HuffmanNode *node = newHuffmanNode('\0', min1->data->weight + min2->data->weight);
node->left = min1->data;
node->right = min2->data;
// 将新的Huffman树结点插入到链表中
ListNode *newNode = newListNode(node);
insertList(list, newNode);
}
// 最后链表中只剩下一个结点,即Huffman树的根结点
return list->head->data;
}
int main() {
// 初始化链表
List *list = newList();
// 向链表中插入6个结点
insertList(list, newListNode(newHuffmanNode('a', 3)));
insertList(list, newListNode(newHuffmanNode('b', 2)));
insertList(list, newListNode(newHuffmanNode('c', 1)));
insertList(list, newListNode(newHuffmanNode('d', 5)));
insertList(list, newListNode(newHuffmanNode('e', 6)));
insertList(list, newListNode(newHuffmanNode('f', 4)));
// 菜单功能
int choice;
do {
printf("1. Huffman树的建立\n");
printf("2. Huffman树的中序遍历\n");
printf("3. 退出程序\n");
printf("请输入操作编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
// 构建Huffman树
HuffmanNode *root = buildHuffmanTree(list);
printf("Huffman树已建立\n");
break;
case 2:
// 打印Huffman树的中序遍历结果
printf("Huffman树的中序遍历结果为:");
printHuffmanTree(root);
printf("\n");
break;
case 3:
// 退出程序
printf("程序已退出\n");
break;
default:
printf("请输入正确的操作编号!\n");
break;
}
} while (choice != 3);
// 销毁链表
destroyList(list);
return 0;
}
```
注意,上述程序中使用了链表来存储Huffman树结点,因此需要实现链表的相关操作函数。在程序中,菜单功能使用了一个do-while循环,用户可以选择不同的操作。当用户选择退出程序时,程序会销毁链表并结束运行。
阅读全文