📄 使用链表编写的香农编码.txt
字号:
#include "iostream.h"
#include "math.h"
class DATA//数据类
{
public:
DATA(){next=NULL;qian=NULL;}
char Xi;
char* key;
float PXi,PXj;
int Ki;
DATA *next,*qian;
};
void a(DATA *p)//算码字
{
int l=0,y=p->Ki;
char* L=new char[y];
float z=p->PXj;
while(y>0)
{
z=z*2;
if(z>=1)//->字符0.1
{z=z-1;
L[l]='1';}
else L[l]='0';
l++;
y--;
}//此时得到编码数组L
p->key=L;//赋给信源数组
}
void main()
{int l;
float z,y=0;
char L;
DATA *p=new DATA;//ini
DATA *head=p;//ini
while(1)
{cout<<"1.编码"<<endl<<"2.结束程序"<<endl;
cin>>l;
if(l>=2) break;
switch(l)//选择
{
case 1:{//输入信源排序并编码
cout<<"分别输入Xi与PXi的值,PXi的值输入9表示输入结束"<<endl;
while(1)
{
cout<<"Xi的值:";
cin>>L;
cout<<"PXi的值:";
cin>>z;
if(z==9) break;
p->Xi=L;//赋值
p->PXi=z;
if(p->qian==NULL) p->PXj=0;
else {p->PXj=p->qian->PXi+p->qian->PXj;}//!
p->Ki=int(0.999-log10(z)/log10(2));
p->next=new DATA;
p->next->qian=p;
p=p->next;
}//到此完成对信源的输入及初始计算
for(p=head;p->next!=NULL;p=p->next)
{
a(p);
cout<<p->key;//输出编码
}
cout<<endl;
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -