常量介绍:

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++)——二牛原创相关推荐

  1. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置

    <(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...

  2. c语言随机生成字母链表,C语言 尾插法建立单链表 插入26个英文字母

    C语言 尾插法建立单链表 插入26个英文字母0 uosnmzer2016.09.13浏览131次分享举报 #include #include #include /* run this program ...

  3. C语言不带头结点的单链表

    C语言不带头结点的单链表 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>typedef st ...

  4. C语言使用头插法建立单链表并输出

    使用头插法建立单链表并输出## 标题 # include<stdio.h>typedef struct node{int data;struct node *next; } Lnode;L ...

  5. 阅读笔记-数据结构(C语言)-严蔚敏老师-单链表

    这里创建单链表都是指定长度进行创建的,之后会补上动态创建. 单链表 一.头插法创建单链表(p30) 二.尾插法创建单链表 三.按索引查找和按值查找 四.插入到第几个节点之后 五.删除节点 一.头插法创 ...

  6. C语言-线性表基本操作之单链表

    下面是单链表的基本操作: #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct L ...

  7. c语言,递归翻转一个单链表,c实现单链表

    目的:主要是练习c里面单链表的实现,递归思想复习; #include <stdlib.h> #include <stdio.h>typedef struct _Node{//定 ...

  8. C语言线性表之循环单链表

    #include<stdio.h> #include<stdlib.h>int typeOfLinkList;typedef struct LNode{int data;str ...

  9. 不带头结点的单链表c语言,数据结构:C语言实现----不带头结点单链表总结

    不带头结点的单链表结构体声明 typedef struct Node { int data; struct Node *next; }Node, *LinkList; (1)初始化 void Init ...

  10. 【C语言】数据结构实验报告--单链表

    实验内容 一.将单链表按基准划分,以单链表的首节点值x为基准将该单链表分割为两部分,使所有小于x的结点排在大于或等于x的结点之前. #include<stdio.h> #include&q ...

最新文章

  1. python之CSV文件格式
  2. 一道腾讯面试题:厉害了我的杯
  3. SVN系列操作(二)svn不显示图标的解决方法
  4. EventBus3.0 List事件遇到的坑
  5. hdu 1025 Constructing Roads In JGShining's Kingdom
  6. fragment中文网_Android使用Fragment打造万能页面切换框架
  7. python find函数_Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案
  8. Report_SRW在RDF中初始化的重要性(案例)
  9. 【渝粤教育】电大中专药物分析技术基础_1作业 题库
  10. SLAM--G2o实现BA优化
  11. 如何打造一个能自动回复的钉钉机器人
  12. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
  13. 运行java提示找不到符号_运行java代码时出现找不到符号错误怎么解决
  14. 关于webpack5打包图片不报错但是也不显示问题
  15. 贰零贰壹·陆·伍·|比赛|·|创客|:第二十届自治区青少年机器人竞赛心得总结
  16. 苹果画画软件_Mac必装的10个软件,让你的Mac如虎添翼
  17. iOS中的各种快捷键
  18. 对web网站模拟压力测试
  19. 英特尔的指令集体系结构_INTEL 体系结构 MMX™ 技术开发者手册
  20. 共线条件方程c语言程序,云南师范大学《C语言》期末考试样卷及答案

热门文章

  1. opencv codebook
  2. Linux-虚拟机迁移步骤
  3. hp服务器驱动有专门的网站吗,惠普官网的驱动是哪个网址
  4. 【MySQL高性能】Canal数据同步神器
  5. dell主板恢复出厂设置_DELL(戴尔)BIOS进入及恢复默认值
  6. windows更改redis配置文件
  7. 最新《圣思园JavaSE实地培训系列教程》
  8. 红米ac2100有ipv6吗_【0107-多功能版OpenWrt】红米小米AC2100|IPV6|酸奶|SmartDNS|多拨|猫咪,附教程...
  9. 超像素学习笔记(1)——概念及判别条件
  10. uni-app打开淘宝、京东,并跳转到对应的商品链接