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