Pagini recente » Cod sursa (job #2558845) | Cod sursa (job #1907235) | Cod sursa (job #1599117) | Cod sursa (job #2615466) | Cod sursa (job #502854)
Cod sursa(job #502854)
#include <fstream.h>
ifstream f("huffman.in");
ofstream g("huffman.out");
struct nod
{
long long info;
nod *stanga,*dreapta;
};
nod *r,**C1,**C2;
long long n,st,dr,st1,dr1,s=0,x=-1;
char cod[10000];
void citire()
{
f>>n;
st=st1=1;
dr1=0;
dr=n;
long long i;
C1=new nod*[n+1];
C2=new nod*[n+1];
for(i=1;i<=n;i++)
{
C1[i]=new nod;
f>>C1[i]->info;
C1[i]->stanga=C1[i]->dreapta=NULL;
}
f.close();
}
void inserareCoada(nod *x,long long &st,long long &dr)
{
dr++;
C2[dr]=new nod;
C2[dr]=x;
}
void stergereCoada(long long &st,long long &dr)
{
st++;
}
int coadaVida(long long st,long long dr)
{
if(dr<st)
return 1;
return 0;
}
nod* minim()
{
nod *min,*min1;
if(coadaVida(st1,dr1))
{
min=C1[st];
stergereCoada(st,dr);
return min;
}
else
{
if(coadaVida(st,dr))
{
min=C2[st1];
stergereCoada(st1,dr1);
return min;
}
else
{
min=C1[st];
min1=C2[st1];
if(min->info<=min1->info)
{
stergereCoada(st,dr);
return min;
}
else
{
stergereCoada(st1,dr1);
return min1;
}
}
}
}
void creareHuffman(nod *&r)
{
long long k;
nod *x,*y;
for(k=1;k<=n-1;k++)
{
x=minim();
y=minim();
r=new nod;
r->info=x->info+y->info;
r->stanga=x;
r->dreapta=y;
s+=r->info;
inserareCoada(r,st1,dr1);
}
}
long long conversie(char *s)
{
long long n=strlen(s)-1,m=n,p=0,f=1;
for(long long i=0;i<=m;i++)
{
f=(s[i]-'0')*(1<<n);
n--;
p+=f;
}
return p;
}
void codifica(nod *r,long long y)
{
if(r)
{
if(r->stanga==NULL && r->dreapta==NULL && r->info==y)
{
cod[x+1]=0;
g<<strlen(cod)<<' '<<conversie(cod)<<'\n';
}
if(r)
{
x++;
cod[x]='0';
codifica(r->stanga,y);
cod[x]='1';
codifica(r->dreapta,y);
x--;
}
}
}
int main()
{
citire();
creareHuffman(r);
g<<s<<'\n';
for(long long i=1;i<=n;i++)
{
if(i!=1 &&C1[i]->info==C1[i-1]->info)
continue;
x=-1;
cod[0]='\0';
codifica(r,C1[i]->info);
}
g.close();
return 0;
}