用c语言实现香农编码,单链表实现香农编码(C++)——二牛原创
常量介绍:
si:信源符号
p(si):该项概率
pi:前i-1项累加概率 p(s1)+p(s2)+...+p(s(i-1))
li:码长,计算公式[
-log(p(si))]+1 ;(下取整)
求解步骤:
1、将信源符号按从大到小的顺序排列
2、求码长li
3、求累加概率pi
4、将累加概率pi转换为二进制小数,并根据码长li取小数点后li为作为码字
介绍:
本程序是将原始数据存放到记事本
Data.txt中,记事本应与.cpp文件放入同一文件目录下,然后再程序中读取记事本内数据进行香农编码。
记事本:
介绍:
名称为:Data.txt
内容:第一行:"s p(si)",且内容以空格隔开,注意换行
实例图片:
头文件:
#include
#include
#include
using namespace std;
单链表结构体声明:
typedef struct LinkList //单链表结构体
{
string Mark; //符号s
double P; //概率
double SumP; //累加概率
int CodeLength; //码长
string Codeword; //码字
struct LinkList *Next; //下一结点
}LinkNode;
主函数:
void main() //主函数
{
LinkNode *L,*R,*S,*T; //定义链表节点
L=new LinkNode; //声明
L->CodeLength=0;
L->Mark=L->Codeword="";
L->P=L->SumP=0;
L->Next=NULL;
ifstream inf("Data.txt"); //获取数据
string s,temp;
int i=0; //标志作用
char InitialData[50]; //用于保存读取出来的数字的数组
while (std::getline(inf, s)) //将inf文件中的数字读取到data数组中
{
char *p;
if(i>1) //第二行开始
{
S=new LinkNode;
S->Next=NULL;
}
strcpy(InitialData,s.c_str());
p = strtok(InitialData, " ");
while(p) //信原符号、概率、码长
{
if(i>1&&i%2==0) //第一列
{
S->Mark=p;
}
if(i>1&&i%2==1) //第二列
{
temp=p;
S->P=(double)atof(temp.c_str());
if(S->P<0)
{
cout<
return;
}
S->CodeLength=int(-log(S->P)/log(2))+1;
}
p = strtok(NULL, " ");
i++;
}
if(i>=4) //排序并算出累加概率
{
T=L->Next;
R=L;
while(T!=NULL)
{
T->SumP=R->SumP+R->P;
if(S->P>T->P&&S->Next==NULL)
{
R->Next=S;
S->Next=T;
S->SumP=R->SumP+R->P;
T->SumP=S->SumP+S->P;
}
R=T;
T=R->Next;
}
if(S->Next==NULL) //S概率最小的情况
{
R->Next=S;
S->SumP=R->P+R->SumP;
}
}
}
if((S->Next==NULL&&(S->P+S->SumP)!=1)||(R->Next==NULL&&(R->P+R->SumP)!=1)) //判断概率格式
{
cout<
return;
}
R=L;
T=R->Next;
double Code;
cout<
while(T!=NULL) //得出码字、输出、销毁链表
{
Code=T->SumP;
for(int j=1;j<=T->CodeLength;j++)
{
Code*=2;
if(Code<1)
{
T->Codeword+="0";
}
else
{
T->Codeword+="1";
Code=Code-int(Code);
}
}
cout<Mark<P<SumP<CodeLength<Codeword<
delete(R);
R=T;
T=T->Next;
}
delete(R);
delete(T);
inf.close(); //读取完毕后,关闭文件
}
运行结果:
用c语言实现香农编码,单链表实现香农编码(C++)——二牛原创相关推荐
- 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置
<(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...
- c语言随机生成字母链表,C语言 尾插法建立单链表 插入26个英文字母
C语言 尾插法建立单链表 插入26个英文字母0 uosnmzer2016.09.13浏览131次分享举报 #include #include #include /* run this program ...
- C语言不带头结点的单链表
C语言不带头结点的单链表 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>typedef st ...
- C语言使用头插法建立单链表并输出
使用头插法建立单链表并输出## 标题 # include<stdio.h>typedef struct node{int data;struct node *next; } Lnode;L ...
- 阅读笔记-数据结构(C语言)-严蔚敏老师-单链表
这里创建单链表都是指定长度进行创建的,之后会补上动态创建. 单链表 一.头插法创建单链表(p30) 二.尾插法创建单链表 三.按索引查找和按值查找 四.插入到第几个节点之后 五.删除节点 一.头插法创 ...
- C语言-线性表基本操作之单链表
下面是单链表的基本操作: #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct L ...
- c语言,递归翻转一个单链表,c实现单链表
目的:主要是练习c里面单链表的实现,递归思想复习; #include <stdlib.h> #include <stdio.h>typedef struct _Node{//定 ...
- C语言线性表之循环单链表
#include<stdio.h> #include<stdlib.h>int typeOfLinkList;typedef struct LNode{int data;str ...
- 不带头结点的单链表c语言,数据结构:C语言实现----不带头结点单链表总结
不带头结点的单链表结构体声明 typedef struct Node { int data; struct Node *next; }Node, *LinkList; (1)初始化 void Init ...
- 【C语言】数据结构实验报告--单链表
实验内容 一.将单链表按基准划分,以单链表的首节点值x为基准将该单链表分割为两部分,使所有小于x的结点排在大于或等于x的结点之前. #include<stdio.h> #include&q ...
最新文章
- python之CSV文件格式
- 一道腾讯面试题:厉害了我的杯
- SVN系列操作(二)svn不显示图标的解决方法
- EventBus3.0 List事件遇到的坑
- hdu 1025 Constructing Roads In JGShining's Kingdom
- fragment中文网_Android使用Fragment打造万能页面切换框架
- python find函数_Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案
- Report_SRW在RDF中初始化的重要性(案例)
- 【渝粤教育】电大中专药物分析技术基础_1作业 题库
- SLAM--G2o实现BA优化
- 如何打造一个能自动回复的钉钉机器人
- 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
- 运行java提示找不到符号_运行java代码时出现找不到符号错误怎么解决
- 关于webpack5打包图片不报错但是也不显示问题
- 贰零贰壹·陆·伍·|比赛|·|创客|:第二十届自治区青少年机器人竞赛心得总结
- 苹果画画软件_Mac必装的10个软件,让你的Mac如虎添翼
- iOS中的各种快捷键
- 对web网站模拟压力测试
- 英特尔的指令集体系结构_INTEL 体系结构 MMX™ 技术开发者手册
- 共线条件方程c语言程序,云南师范大学《C语言》期末考试样卷及答案
热门文章
- opencv codebook
- Linux-虚拟机迁移步骤
- hp服务器驱动有专门的网站吗,惠普官网的驱动是哪个网址
- 【MySQL高性能】Canal数据同步神器
- dell主板恢复出厂设置_DELL(戴尔)BIOS进入及恢复默认值
- windows更改redis配置文件
- 最新《圣思园JavaSE实地培训系列教程》
- 红米ac2100有ipv6吗_【0107-多功能版OpenWrt】红米小米AC2100|IPV6|酸奶|SmartDNS|多拨|猫咪,附教程...
- 超像素学习笔记(1)——概念及判别条件
- uni-app打开淘宝、京东,并跳转到对应的商品链接