博客
关于我
哈弗曼编码
阅读量:364 次
发布时间:2019-03-04

本文共 5499 字,大约阅读时间需要 18 分钟。

数据压缩中的编码问题实验

#define _CRT_SECURE_NO_WARNINGS#include
#include
#define Minweight -1typedef struct Node* ElementType;struct Node { int Weight; char Key;};typedef struct HfTNode* HuffmanTree;struct HfTNode { ElementType Data; HuffmanTree Left, Right;};typedef struct Heapstruct* MinHeap;struct Heapstruct { HuffmanTree* Elements; int Size; int Capacity;};typedef struct SNode* PtrToSNode;struct SNode { ElementType Data; PtrToSNode Next; };typedef PtrToSNode Stack;Stack CreateStack(void);//创建一个栈int IsEmpty_Stack(Stack);//判断栈是否为空void Push(Stack, ElementType);//将元素放入栈中ElementType Pop(Stack);//将元素从栈顶拿出ElementType GetStackTop(Stack);//查看栈顶元素MinHeap CreateMinHeap(int MaxSize);int IsEmpty_MinHeap(MinHeap H);int IsFull_MinHeap(MinHeap H);void Insert_MinHeap(MinHeap H, HuffmanTree Item);HuffmanTree Delete_MinHeap(MinHeap H);void MinMaking(MinHeap H, int Root);void BuildMinHeap(MinHeap H);HuffmanTree Huffman(MinHeap H);void PrintPath(HuffmanTree T);int main(void){ Stack S; int MaxSize; MinHeap H; HuffmanTree T; S = CreateStack(); do { printf("输入关键字个数\n"); scanf("%d", &MaxSize); getchar(); if (MaxSize <= 1) printf("不必为%d个关键字编码\n"); else break; } while (1); H = CreateMinHeap(MaxSize); for (int i = 1; i <= MaxSize; i++) { H->Elements[i] = (HuffmanTree)malloc(sizeof(struct HfTNode)); H->Elements[i]->Left = NULL; H->Elements[i]->Right = NULL; H->Elements[i]->Data = (ElementType)malloc(sizeof(struct HfTNode)); printf("输入关键字及出现频率\n"); scanf("%c %d", &H->Elements[i]->Data->Key, &H->Elements[i]->Data->Weight); getchar(); }//建立一个任意顺序存放关键字和权重的数组 T = Huffman(H);//将这个数组转换成哈弗曼树 printf("#######
#######\n"); PrintPath(T);//将哈弗曼树转换成编码!}//将哈弗曼树转换成编码void PrintPath(HuffmanTree T)//所有无用树结点的Key都会被修改为-1{ HuffmanTree PtoT; HuffmanTree Root; char Word[10]; int i = 0; while (T->Data->Key != -1) { PtoT = T; Root = PtoT; i = 0; while (1) { if (!PtoT->Left && !PtoT->Right) { Word[i++] = PtoT->Data->Key; Word[i] = '\0'; printf("%s\n", Word); PtoT->Data->Key = -1; if ((!Root->Left || Root->Left->Data->Key == -1) && (!Root->Right || Root->Right->Data->Key == -1)) Root->Data->Key = -1; break; } else if (PtoT->Left && PtoT->Left->Data->Key != -1) { Word[i++] = '1'; Root = PtoT; PtoT = PtoT->Left; continue; } else if (PtoT->Right && PtoT->Right->Data->Key != -1) { Word[i++] = '0'; Root = PtoT; PtoT = PtoT->Right; continue; } PtoT->Data->Key = -1; break; } }}//以下为用到的堆函数MinHeap CreateMinHeap(int MaxSize){ MinHeap H; H = (MinHeap)malloc(sizeof(struct Heapstruct)); H->Elements = (HuffmanTree*)malloc(sizeof(HuffmanTree) * (MaxSize + 1)); H->Size = MaxSize; H->Capacity = MaxSize; H->Elements[0] = (HuffmanTree)malloc(sizeof(struct HfTNode)); H->Elements[0]->Data = (ElementType)malloc(sizeof(struct Node)); H->Elements[0]->Data->Weight = Minwight; return H;}int IsEmpty_MinHeap(MinHeap H){ return (H->Size == 0);}int IsFull_MinHeap(MinHeap H){ return (H->Size == H->Capacity);}void Insert_MinHeap(MinHeap H, HuffmanTree Item){ int i; if (IsFull_MinHeap(H)) return; i = ++H->Size;//i相当于子结点下标,i/2相当于父结点下标 for (; H->Elements[i / 2]->Data->Weight > Item->Data->Weight; i /= 2) H->Elements[i] = H->Elements[i / 2]; H->Elements[i] = Item;}HuffmanTree Delete_MinHeap(MinHeap H){ HuffmanTree Item, MinItem; int Parent, Child; if (IsEmpty_MinHeap(H)) return NULL; MinItem = H->Elements[1]; Item = H->Elements[H->Size--]; for (Parent = 1; Parent * 2 <= H->Size; Parent = Child) { Child = Parent * 2; if (H->Elements[Child]->Data->Weight > H->Elements[Child + 1]->Data->Weight) Child++; if (H->Elements[Child]->Data->Weight > Item->Data->Weight) break; else H->Elements[Parent] = H->Elements[Child]; } H->Elements[Parent] = Item; return MinItem;}void MinMaking(MinHeap H, int Root){ int Parent, Child; HuffmanTree Item; Item = H->Elements[Root]; for (Parent = Root; Parent * 2 <= H->Size; Parent = Child) { Child = Parent * 2; if (Child + 1 < H->Size && H->Elements[Child]->Data->Weight > H->Elements[Child + 1]->Data->Weight) Child++; if (H->Elements[Child]->Data->Weight > Item->Data->Weight) break; else H->Elements[Parent] = H->Elements[Child]; } H->Elements[Parent] = Item;}void BuildMinHeap(MinHeap H){ int i; for (i = H->Size / 2; i >= 1; i--) { MinMaking(H, i); }}HuffmanTree Huffman(MinHeap H){ HuffmanTree T; BuildMinHeap(H); while (H->Size > 1) { T = (HuffmanTree)malloc(sizeof(struct HfTNode)); T->Left = Delete_MinHeap(H); T->Right = Delete_MinHeap(H); T->Data = (ElementType)malloc(sizeof(struct Node)); T->Data->Weight = T->Left->Data->Weight + T->Right->Data->Weight; Insert_MinHeap(H, T);//将新T插入最小值 } T = Delete_MinHeap(H); return T;}//以下为所用到的栈函数Stack CreateStack(void){ Stack S = (Stack)malloc(sizeof(struct SNode)); S->Next = NULL; return S;}int IsEmpty_Stack(Stack S){ return (S->Next == NULL);}void Push(Stack S, ElementType Sdata){ PtrToSNode P; P = (PtrToSNode)malloc(sizeof(struct SNode));//创建新的栈结点 P->Data = Sdata; P->Next = S->Next;//将栈顶链接在新栈顶后 S->Next = P;//将新栈顶链接在栈头后}ElementType Pop(Stack S){ if (IsEmpty_Stack(S)) { printf("The Stack is Empty."); return NULL; } else { PtrToSNode P; ElementType Sdata; P = S->Next;//找到栈顶结点 Sdata = P->Data;//取出数据 S->Next = P->Next;//栈头链接新的栈顶 free(P);//释放原栈顶 return Sdata; }}ElementType GetStackTop(Stack S){ if (IsEmpty_Stack(S)) { printf("The Stack is empty."); return NULL; } else return S->Next->Data;}

运行截图

转载地址:http://ivbr.baihongyu.com/

你可能感兴趣的文章
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>