
#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)
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)