Hi all,
I'm trying to write the Hufmann code to encode a given file & give me the compression ratio. but when I run this programme, I'm getting segmentation fault. Can you please help me with correcting it ?
/*************************/
/*************************/
// HUFMANN.C
/*************************/
/*************************/
#include<stdio.h>
#include<stdlib.h>
#include<input.h>
#define MAXBITS 32
#define MAXNODES 512
#define MAXSYMBS 256
int hmin(void);
void hinsert(int,int);
struct codetype{
int bits[MAXBITS];
int startpos;
};
struct nodetype{
int freq;
int father;
int isleft;
};
typedef struct hlist{
int pos;
int hfreq;
struct hlist *next;
}hnode;
hnode *hroot=NULL,*traversal;
extern struct list a[256];
extern int n;
int hmin()
{
int p;
p = hroot->pos;
traversal=hroot;
hroot = traversal->next;
free(traversal);
return(p);
}
void hinsert(int p,int freq)
{
hnode* new1=(hnode *)malloc(sizeof(hnode));
new1->pos = p;
new1->hfreq = freq;
traversal = hroot;
if(hroot == NULL)
{
hroot = new1;
hroot->next = NULL;
return;
}
if(hroot->next == NULL)
{
if(hroot->hfreq>new1->hfreq)
{
new1->next = hroot;
hroot =new1;
traversal->next =NULL;
return;
}
else
{
hroot->next =new1;
new1->next =NULL;
return;
}
}
if(hroot->hfreq>=new1->hfreq)
{
new1->next =hroot;
hroot = new1;
return;
}
while(traversal->next->hfreq<new1->hfreq)
{
traversal=traversal->next;
if(traversal->next==NULL)
break;
}
if(traversal->next->hfreq>=new1->hfreq)
{
new1->next = traversal->next;
traversal->next = new1;
return;
}
new1->next = NULL;
traversal->next = new1;
}
int main(){
struct codetype cd,code[MAXSYMBS];
struct nodetype node[MAXNODES];
int i,k,p,p1,p2,root;
char symb,alph[MAXSYMBS];
system('clear');
for(i=0;i<MAXSYMBS;i++)
alph[i]=' ';
//scanf("%d",&n);
input();
for(i=0;i<n;i++){
fflush(stdin);
scanf("%c %d",&symb,&node[i].freq);
// symb = a[i].alph;
//node[i].freq = a[i].freq;
hinsert(i,node[i].freq);
alph[i]=symb;
}
for(p=n;p<(2*n-1);p++){
p1 =hmin();
p2 =hmin();
node[p1].father = p;
node[p1].isleft = 1;
node[p2].father = p;
node[p2].isleft = 0;
node[p].freq =node[p1].freq+node[p2].freq;
hinsert(p,node[p].freq);
}
root = hmin();
for(i=0;i<n;i++){
cd.startpos = MAXBITS;
p=i;
while(p!=root){
--cd.startpos;
if(node[p].isleft)
cd.bits[cd.startpos] =0;
else
cd.bits[cd.startpos] =1;
p =node[p].father;
}
for(k=cd.startpos;k<MAXBITS;k++)
code[i].bits[k]=cd.bits[k];
code[i].startpos =cd.startpos;
}
for(i=0;i<n;i++){
printf("\n%c %d",alph[i],node[i].freq);
for(k=code[i].startpos;k<MAXBITS;k++)
printf(" %d",code[i].bits[k]);
printf("\n");
}
return(0);
}
/*************************/
// INPUT.H
/*************************/
#include<stdio.h>
struct list{
char alph;
int freq;
};
struct list a[256];
int n;
input()
{
FILE *fin,*fout;
char *filein,*fileout,ch;
int i,k,f;
printf("enter the filename of from which the data is to be read::\n");
scanf("%s",filein);
fin=fopen(filein,"r");
for(i=0,n=0;i<256;i++)
{ f=0;k=0;
while((ch=fgetc(fin))!=EOF)
{
if(ch==i)
{ f=1;
a[n].alph=ch;
k++;
}
}
if(f==1){
a[n].freq =k;
n++;
}
rewind(fin);
}
fclose(fin);
}