用c语言实现算术编码和解码

用c语言实现算术编码和解码,第1张

Turbo c 2.0编译通过

#include  <stdio.h>

#include  <stdlib.h>

#include  <string.h>

#define  LENGTH  100 /*字符串(编码前或编码后)的最大长度*/

/*编码*/

void    encode(char    *strsource)

/*解码*/

void    decode(char    *strcode)

void  main()  

{      

        char  code[LENGTH]="BILL  GATES"  

        encode(code)

        printf("\nencoded  string  is:%s\n",code)

        decode(code)

        printf("\ndecoded  string  is:%s\n",code)

        getch()

}

void  encode(char  *strsource){

        char  *p=strsource,tmp[LENGTH]={'\0'},buffer[3]          

        while(*p){

                itoa(*p++,buffer,10)

                strcat(tmp,"%")

                strcat(tmp,buffer)          

        }      

        strcpy(strsource,tmp)    

}

void  decode(char  *strcode){

        int  i=0

        char  *p,*s=strcode,tmp[LENGTH]={'\0'}

        char  *cSplit="%"

        p=strtok(s,cSplit)

        while(p)

        {

            tmp[i++]  =  atoi(p)            

            p=strtok(NULL,cSplit)

        }

        strcpy(strcode,tmp)        

}

以下是哈夫曼编码

#include<iostream>

#include<math.h>

#include<string>

#include<iomanip>

using namespace std

int n

int isin(string str,char a)

{

int temp=0

for(int i=0i<str.length()i++)

{

if(str[i]==a) temp=1

}

return temp

}

void bubble(double p[],string sign[])//排序

{

for(int i=0i<n-1i++)

{

for(int j=i+1j<nj++)

{

if(p[i]<p[j])

{

double temp=p[i]

p[i]=p[j]

p[j]=temp

string m=sign[i]

sign[i]=sign[j]

sign[j]=m

}

}

}

}

void huff(double tempp[],string tempstr[])

{

double p[20][20]

string sign[20][20]

sign[0][i]=tempstr[i]//符号放在sign数组中

for(int i=0i<ni++)

{

p[0][i]=tempp[i] //p数组放对应的概率(第1列中)

}

for(i=0i<n-1i++)

{

bubble(p[i],sign[i])//第一次排序

for(int j=0j<n-2-ij++)

{

p[i+1][j]=p[i][j] //前n-2-i个概率重新放在p数组中(是数组的第2列中)

sign[i+1][j]=sign[i][j]

}

p[i+1][j]=p[i][j]+p[i][j+1]//第一次两个最小概率求和

sign[i+1][j]=sign[i][j]+sign[i][j+1]//符号跟随

for(j=n-1-ij<nj++)

{

p[i+1][j]=0

}

}

string final[20]

for(i=n-2i>=0i--)

{

for(int k=0k<nk++)

{

if(isin(sign[i][n-2-i],sign[0][k][0])) final[k]+="0"

if(isin(sign[i][n-1-i],sign[0][k][0])) final[k]+="1"

}

}

cout<<setw(9)<<"哈弗曼编码如下:"<<endl

for(i=0i<ni++)

{

cout<<setw(7)<<sign[0][i]<<setw(7)<<p[0][i]<<setw(10)<<final[i]<<

setw(7)<<final[i].length()<<endl

}

}

void main()

{

char a[50]

cout<<"该字符串符号为:"

cin>>a

string s=a

n=s.length()

char b[20][2]

for(int i=0i<ni++)

{

b[i][0]=a[i]

b[i][1]='\0'

}

string str[20]

for(i=0i<ni++)

{

str[i]=b[i]

}

double tempp[20]

cout<<"字符概率依次为:"

for(i=0i<ni++)

{

cin>>tempp[i]

}

huff(tempp,str)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11304096.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存