• 大小: 8KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-07-01
  • 语言: C/C++
  • 标签: 游程编码  c++  

资源简介

游程编码与哈夫曼编码结合,可以直接运行。很好理解的代码。

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
using namespace std;
#define n 100
#define m 2*n-1
//码结点的存储结构
typedef struct{
char ch;
char bits[9];
int len;
}CodeNode;
typedef CodeNode HuffmanCode[n+1];
//树节点
typedef struct{
int weight;
int lchildrchildparent;
}HTNode;
typedef HTNode HuffmanTree[m+1];

int num;
double hx=0.0;
int lengthhigh;//输入阵列的长和高
char sourdata[256];//输入中的符号们
int pinglv[256];//输入中每个符号的频率
double gailv[256];//输入中每个符号发生的概率
char st[256][256]s[256][256]; //st接受输入的字符,s接受译码时的字符
int YClen[256][256];     //存储游程长度
char YCcode[256][256];     //存储游程码
int YCyilen[256][256];     //存储译码过程的游程长度
char YCyicode[256][256];     //存储译码过程的游程码
char YCnum[256];       //存储每行的游程码个数
string YC;          //游程编码值
string liangwei[4];     //存储两位二进制数
string sanwei[8];     //存储三位二进制数
HuffmanTree HT;   ///
HuffmanCode HC;  //创建霍夫曼树
int z;

//选择权值最小的两个值
void select(HuffmanTree HTint kint &s1int &s2){
int ij;
int minl=32767;
//现在所有节点中选取一个权值最小的 记为s1
for(i=0;i<=k;i++){
if(HT[i].weight j=i;
minl=HT[i].weight;
}
}
s1=j;
minl=32767;
//再在除了S1的结点外的其他所有结点中,找另外一个最小的
for(i=0;i<=k;i++){
if(HT[i].weight j=i;
minl=HT[i].weight;
}
s2=j;
}
}
//统计相关数据 字符种类 字符出现的频数和概率
void tongji(int highint length){   //分析出字符阵列中出现的所有字符并求出其对应的出现概率
for (int i=0;i<100;i++){    //先将每个字符出现的次数预设为0
pinglv[i]=0;
}
num=0;
int sign=0;
//统计阵列中出现的字符,并存入数组中
for (i=0;i for (int j=0;j sign=0;
for(int k=0;k if (sourdata[k]==st[i][j]){
pinglv[k]=pinglv[k]+1;
sign=1;
}
}
if (sign==0){
sourdata[num]=st[i][j];
pinglv[num]=1;
num=num+1;
}
}
//求解每个字符对应的概率
int add=0;
for(i=0;i add=add+pinglv[i];//统计总和 为了求概率
for(i=0;i gailv[i]=(double)(double)pinglv[i]/(double)add;
}
//建立霍夫曼树
void chuffmantree(HuffmanTree &HTHuffmanCode &HCint cnt[]char str[]){
int is1s2;
for(i=0;i<=2*num-1;i++){
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].parent=0;
HT[i].weight=0;
}
for(i=0;i<=num;i++){
HT[i].weight=cnt[i];
}
for(i=num;i<2*num-1;i++){
select(HTi-1s1s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
for(i=0;i<=num;i++){
HC[i].ch=str[i];
}
}

void HuffmanEncoding(HuffmanTree HTHuffmanCode HC){
int cpi;
char cd[n];
int start;
cd[num]=‘\0‘;
for(i=0;i start=num;
c=i;
while((p=HT[c].parent)>0){
start--;
cd[start]=(HT[p].lchild==c)?‘0‘:‘1‘;
c=p;
}
strcpy(HC[i].bits&cd[start]);
HC[i].len=num-start;
}
}

void decode(HuffmanCode HCchar receive[]char s[]){
char str[268];
char cd[9];
int ijk=0p=0cjs;
while(receive[p]!=‘\0‘){
cjs=0;
}
for(i=1;i cd[i]=‘ 

评论

共有 条评论