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; ++i) 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; iarray[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] <= 'z') { 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

Programming Logic & Design Comprehensive
9th Edition
ISBN:9781337669405
Author:FARRELL
Publisher:FARRELL
Chapter3: Understanding Structure
Section: Chapter Questions
Problem 7RQ
icon
Related questions
Question

Huffman code

// C program for Huffman Coding

#include<stdio.h>

#include<stdlib.h>

 

 

#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; ++i)

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<size; ++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] <= 'z')

{

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

Expert Solution
trending now

Trending now

This is a popular solution!

steps

Step by step

Solved in 3 steps

Blurred answer
Knowledge Booster
Header Files
Learn more about
Need a deep-dive on the concept behind this application? Look no further. Learn more about this topic, computer-science and related others by exploring similar questions and additional content below.
Similar questions
  • SEE MORE QUESTIONS
Recommended textbooks for you
Programming Logic & Design Comprehensive
Programming Logic & Design Comprehensive
Computer Science
ISBN:
9781337669405
Author:
FARRELL
Publisher:
Cengage