Huffman code // C program for Huffman Coding #include #include #define MAX_TREE_HT 100 struct MinHeapNode { char data; unsigned freq; struct MinHeapNode *left, *right; }; struct MinHeap { unsigned...


Huffman code


// C program for Huffman Coding


#include


#include




#define MAX_TREE_HT 100




struct MinHeapNode {




char data;




unsigned freq;



struct MinHeapNode *left, *right;


};




struct MinHeap {




unsigned size;




unsigned capacity;




struct MinHeapNode** array;


};




struct MinHeapNode* newNode(char data, unsigned freq)


{


struct MinHeapNode* temp


= (struct MinHeapNode*)malloc


(sizeof(struct MinHeapNode));



temp->left = temp->right = NULL;


temp->data = data;


temp->freq = freq;



return temp;


}




struct MinHeap* createMinHeap(unsigned capacity)



{



struct MinHeap* minHeap


= (struct MinHeap*)malloc(sizeof(struct MinHeap));




minHeap->size = 0;



minHeap->capacity = capacity;



minHeap->array


= (struct MinHeapNode**)malloc(minHeap->


capacity * sizeof(struct MinHeapNode*));


return minHeap;


}




void swapMinHeapNode(struct MinHeapNode** a,


struct MinHeapNode** b)



{



struct MinHeapNode* t = *a;


*a = *b;


*b = t;


}




void minHeapify(struct MinHeap* minHeap, int idx)



{



int smallest = idx;


int left = 2 * idx + 1;


int right = 2 * idx + 2;



if (left < minheap-="">size && minHeap->array[left]->


freq < minheap-="">array[smallest]->freq)


smallest = left;



if (right < minheap-="">size && minHeap->array[right]->


freq < minheap-="">array[smallest]->freq)


smallest = right;



if (smallest != idx) {


swapMinHeapNode(&minHeap->array[smallest],


&minHeap->array[idx]);


minHeapify(minHeap, smallest);


}


}




int isSizeOne(struct MinHeap* minHeap)


{



return (minHeap->size == 1);


}




struct MinHeapNode* extractMin(struct MinHeap* minHeap)



{



struct MinHeapNode* temp = minHeap->array[0];


minHeap->array[0]


= minHeap->array[minHeap->size - 1];



--minHeap->size;


minHeapify(minHeap, 0);



return temp;


}




void insertMinHeap(struct MinHeap* minHeap,


struct MinHeapNode* minHeapNode)



{



++minHeap->size;


int i = minHeap->size - 1;



while (i && minHeapNode->freq < minheap-="">array[(i - 1) / 2]->freq) {



minHeap->array[i] = minHeap->array[(i - 1) / 2];


i = (i - 1) / 2;


}



minHeap->array[i] = minHeapNode;


}




void buildMinHeap(struct MinHeap* minHeap)



{



int n = minHeap->size - 1;


int i;



for (i = (n - 1) / 2; i >= 0; --i)


minHeapify(minHeap, i);


}




void printArr(int arr[], int n)


{


int i;


for (i = 0; i < n;="">


printf("%d", arr[i]);



printf("\n");


}




int isLeaf(struct MinHeapNode* root)



{



return !(root->left) && !(root->right);


}




struct MinHeap* createAndBuildMinHeap(char data[], int freq[], int size)



{



struct MinHeap* minHeap = createMinHeap(size);


 int i;


for ( i=0; i


{


minHeap->array[i] = newNode(data[i], freq[i]);}



minHeap->size = size;


buildMinHeap(minHeap);



return minHeap;


}




struct MinHeapNode* buildHuffmanTree(char data[], int freq[], int size)



{


struct MinHeapNode *left, *right, *top;




struct MinHeap* minHeap = createAndBuildMinHeap(data, freq, size);




while (!isSizeOne(minHeap)) {




left = extractMin(minHeap);


right = extractMin(minHeap);




top = newNode('$', left->freq + right->freq);



top->left = left;


top->right = right;



insertMinHeap(minHeap, top);


}




return extractMin(minHeap);


}




void printCodes(struct MinHeapNode* root, int arr[], int top)



{




if (root->left) {



arr[top] = 0;


printCodes(root->left, arr, top + 1);


}




if (root->right) {



arr[top] = 1;


printCodes(root->right, arr, top + 1);


}




if (isLeaf(root)) {



printf("%c: ", root->data);


printArr(arr, top);


}


}




void HuffmanCodes(char data[], int freq[], int size)



{



struct MinHeapNode* root


= buildHuffmanTree(data, freq, size);




int arr[MAX_TREE_HT], top = 0;



printCodes(root, arr, top);


}



void printFrequency(int freq[],char *a)


{


printf("\nThe frequency of lowercase letters are: \n");


int i;


for (i = 0; i < 26;="" i++)="">




if (freq[i] != 0) {



a[i]=i+'a';


printf("%c - %d\n",


a[i], freq[i]);


}


} printf("\n");


}




void findFrequncy(char S[],char *a, int *f)


{


int i = 0;




while (S[i] != '\0') {



if (S[i] >= 'a' && S[i] <=>


{


f[S[i] - 'a']++;



}i++; }




printFrequency(f,a);


}



int main()


{


char S[2000];



FILE *filePointer;


char ch;


int i=0;



//2


filePointer = fopen("data.txt", "r");



//3


if (filePointer == NULL)


{


printf("File is not available \n");


}


else


{


//4


while ((ch = fgetc(filePointer)) != EOF)


{


S[i]=ch;


i++;


}


}


fclose(filePointer);


char arr[26];


int freq[26]={0};


printf("The data from file is: \n %s \n",S);


findFrequncy(S,arr,freq);




int size = sizeof(arr) / sizeof(arr[0]);


printf("The corresponding Huffman codes:\n");


HuffmanCodes(arr, freq, 26);



return 0;


}


  I want the report of this huffman code that is the algorithm designed explanation of the program

Jun 09, 2022
SOLUTION.PDF

Get Answer To This Question

Related Questions & Answers

More Questions »

Submit New Assignment

Copy and Paste Your Assignment Here