信息与编码理论实验报告Word文件下载.docx

上传人:b****8 文档编号:22687552 上传时间:2023-02-05 格式:DOCX 页数:18 大小:62.63KB
下载 相关 举报
信息与编码理论实验报告Word文件下载.docx_第1页
第1页 / 共18页
信息与编码理论实验报告Word文件下载.docx_第2页
第2页 / 共18页
信息与编码理论实验报告Word文件下载.docx_第3页
第3页 / 共18页
信息与编码理论实验报告Word文件下载.docx_第4页
第4页 / 共18页
信息与编码理论实验报告Word文件下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

信息与编码理论实验报告Word文件下载.docx

《信息与编码理论实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《信息与编码理论实验报告Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。

信息与编码理论实验报告Word文件下载.docx

{

charzifu[10];

structmazi*next;

}QNode,*QueuePtr;

typedefstruct

QueuePtrfront;

QueuePtrrear;

}LinkQueue;

intInitQueue(LinkQueue&

Q)//构造一个空的队列Q

Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

if(!

Q.front)exit(OVERFLOW);

Q.front->

next=NULL;

returnOK;

}

intQueueLength(LinkQueueQ)//求队列长

inti=0;

QueuePtrp;

p=Q.front;

while(Q.rear!

=p)

{

i++;

p=p->

next;

}

returni;

intEnQueue(LinkQueue&

Q,chari[])//插入字符串i为Q的新队尾元素

p=(QueuePtr)malloc(sizeof(QNode));

p)exit(OVERFLOW);

strcpy(p->

zifu,i);

p->

Q.rear->

next=p;

Q.rear=p;

intClearQueue(LinkQueue&

Q)//清空队列

QueuePtrp,q;

Q.rear=Q.front;

p=Q.front->

while(p)

{

q=p;

p=p->

free(q);

intbijiao(LinkQueue&

Q,LinkQueue&

R,LinkQueue&

S)//比较Q和R存入队列S中

QueuePtrq,r;

inti,flag=1;

q=Q.front->

while(q)

r=R.front->

while(r)

{

if(strcmp(q->

zifu,r->

zifu)==0)flag=0;

//不是唯一可译码

r=r->

}

q=q->

if(flag)

q=Q.front->

while(q)

if(strlen(q->

zifu)!

=strlen(r->

zifu))

{

i=strlen(q->

zifu)<

strlen(r->

zifu)?

strlen(q->

zifu):

zifu);

if(strncmp(q->

zifu,i)==0)

{

chars[10],t[10];

if(strlen(q->

strcpy(s,r->

s[strlen(r->

zifu)]='

\0'

;

i=strlen(r->

zifu)-strlen(q->

}

else

strcpy(s,q->

s[strlen(q->

i=strlen(q->

zifu)-strlen(r->

strrev(s);

strncpy(t,s,i);

t[i]='

strrev(t);

EnQueue(S,t);

}

}

if(QueueLength(S))

ClearQueue(R);

flag=bijiao(Q,S,R);

returnflag;

R)//队列Q自己比较,存入R中

inti,flag=2;

r=q->

zifu)==0)

{

flag=0;

EnQueue(R,t);

if(flag&

&

!

QueueLength(R))flag=1;

//唯一可译

voidmain()

LinkQueues0,s1,s2;

inti,N;

chars[10];

InitQueue(s0);

InitQueue(s1);

InitQueue(s2);

cout<

<

"

请输入码字个数N:

cin>

>

N;

请输入各码字:

for(i=0;

i<

i++)

cin>

s;

EnQueue(s0,s);

if(bijiao(s0,s1)==0)cout<

不是唯一可译码"

endl;

elseif(bijiao(s0,s1)==1)cout<

是唯一可译码"

else

if(bijiao(s0,s1,s2)==0)cout<

elsecout<

5、测试结果

实验二:

Huffman编码

(1)进一步熟悉Huffman编码过程;

(2)掌握C语言递归程序的设计和调试技术。

(1)输入:

信源符号个数r、信源的概率分布P;

(2)输出:

每个信源符号对应的Huffman编码的码字。

(1)将信源U的n符号中个概率中两个概率最小的符号合并成一个新符号,新符号的概率为两个符号概率之和,得到只包含n-1个符号的缩减信源U1;

(2)依次继续,直至信源最后只剩下一个符号为止;

(3)将每次合并的两个信源符号分别用0和1码符号表示;

(4)从最后一级缩减信源开始,向前返回,就得出各信源符号所对应的码符号序列,即得各信源符号对应的码字。

typedefstruct{

unsignedfloatweight;

unsignedintparent,lchild,rchild;

}HTNode,*HuffmanTree;

//动态分配数组存储赫夫曼树

typedefchar**HuffmanCode;

//动态分配数组存储赫夫曼编码表

voidHuffmanCoding(HuffmanTree&

HT,HuffmanCode&

HC,float*w,intn)

{//w存放n个字符的权值(均>

0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC。

if(n<

1)return;

voidSelect(HuffmanTreeHT,inta,int&

a1,int&

a2);

HuffmanTreep;

inti,s1,s2,f,c,m,start;

char*cd;

m=2*n-1;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

//0号单元为空

for(p=HT+1,i=1;

=n;

i++,p++,w++)

p->

weight=*w;

p->

parent=0;

lchild=0;

rchild=0;

for(i=n+1;

=m;

i++,p++)

weight=0;

i++){//建赫夫曼树

//在HT[1..i-1]选择parent为0且weight最小的两个结点,其序号分别为s1和s2.

Select(HT,i-1,s1,s2);

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;

//从叶子到根逆向求每个字符的赫夫曼编码

HC=(HuffmanCode)malloc((n+1)*sizeof(char*));

//分配n个字符编码的头指针向量

cd=(char*)malloc(n*sizeof(char));

//分配求编码的工作空间

cd[n-1]='

//编码结束符

for(i=1;

i++){//逐个字符求赫夫曼编码

start=n-1;

//编码结束符位置

for(c=i,f=HT[i].parent;

f!

=0;

c=f,f=HT[f].parent)//从叶子到根逆向求编码

if(HT[f].lchild==c)cd[--start]='

0'

elsecd[--start]='

1'

HC[i]=(char*)malloc((n-start)*sizeof(char));

//为第i个字符编码分配空间

strcpy(HC[i],&

cd[start]);

//从cd复制编码(串)到HC

free(cd);

//释放工作空间

voidSelect(HuffmanTreeHT,inta,int&

a2)

intj;

intmin1;

intmin2;

for(j=1;

j<

=a;

j++)

if(HT[j].parent==0)

min1=HT[j].weight;

a1=j;

break;

if(HT[j].parent==0&

HT[j].weight<

min1)

j!

=a1)

min2=HT[j].weight;

a2=j;

break;

if(HT[j].parent==0&

min2&

min2=HT[j].weight;

a2=j;

float*w;

intn,i;

HuffmanTreeHT;

HuffmanCodeHC;

HT=NULL;

HC=NULL;

printf("

请输入信源符号个数n:

);

scanf("

%d"

&

n);

w=(float*)malloc(n*sizeof(float));

请依次输入各信源符号的概率:

n;

i++)scanf("

%f"

w[i]);

HuffmanCoding(HT,HC,w,n);

printf("

第%d个信源符号的概率为%f,赫夫曼编码为:

%s\n"

i+1,w[i],HC[i+1]);

实验三:

LZW编码

1、实验目的:

(1)进一步熟悉通用编码算法;

(2)掌握C语言程序设计和调试过程中数值的进制转换、数值与字符串之间的转换等技术。

2、实验要求:

本程序将从标准输入中读入待压缩的数据流;

将压缩结果输出到标准输出上去。

3、算法:

(1)将待编码信源序列中的所有单个字符存入串表中,并给每个符号赋一个码字值;

(2)读入第一个输入字符,赋给前缀变量P;

(3)读入下一个输入字符,赋给前缀变量S;

(4)如果S为空,输出P,停止;

否则执行步骤5;

(5)如果PS不在串表中,则将P对应的码字值输出,将PS存入串表,并分配一个码字值,同是将扩展字符S赋给P;

否则将PS赋给P;

4、代码:

stdio.h"

stdlib.h"

string.h"

typedefstructzifu

chara[30];

};

structzifu*x,*y;

inti,j,k,N,flag;

chars[30],p[30],q[30],z[30];

请输入信源个数:

x=y=(zifu*)malloc(N*sizeof(zifu));

请输入信源序列:

i++)cin>

x[i].a;

i++)strcpy(&

z[i],x[i].a);

k=0;

strcpy(y[0].a,x[0].a);

flag=1;

for(j=0;

=k;

j++)if(strcmp(y[j].a,x[i].a)==0)flag=0;

if(flag)

k++;

strcpy(y[k].a,x[i].a);

可将信源编码为:

strcpy(p,&

z[0]);

p[1]='

strcpy(s,&

z[i]);

s[1]='

strcpy(q,p);

strcat(q,s);

j++)if(strcmp(q,y[j].a)==0)flag=0;

strcpy(y[k].a,q);

for(j=0;

k;

j++)if(strcmp(p,y[j].a)==0)cout<

j+1<

"

strcpy(p,s);

else

strcpy(p,q);

for(j=0;

输出字符串序列:

j++)cout<

y[j].a<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1