-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhc_tree.c
75 lines (59 loc) · 2.68 KB
/
hc_tree.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "hc_tree.h"
HCTree* createHCTree() {
HCTree* pNewHCTree = (HCTree*)calloc(1, sizeof(HCTree));
if (pNewHCTree == NULL) {
fprintf(stderr, "ERROR: Failed to Create Huffman Coding Tree!\nCAUSE: Memory Allocation for Huffman Coding Tree Failed!\n");
return NULL;
}
pNewHCTree->pRoot = NULL;
return pNewHCTree;
}
void generateHCTree(HCTree* pHCTree, HCTNQueue* pCharacterHCTNQueue, HCTNQueue* pInternalHCTNQueue) {
if (pHCTree == NULL) {
fprintf(stderr, "ERROR: Failed to Generate Huffman Coding Tree!\nCAUSE: Pointer to Huffman Coding Tree is NULL!\n");
return;
}
if (pCharacterHCTNQueue == NULL) {
fprintf(stderr, "ERROR: Failed to Generate Huffman Coding Tree!\nCAUSE: Pointer to Character Huffman Coding Tree Node Queue is NULL!\n");
return;
}
if (pInternalHCTNQueue == NULL) {
fprintf(stderr, "ERROR: Failed to Generate Huffman Coding Tree!\nCAUSE: Pointer to Internal Huffman Coding Tree Node Queue is NULL!\n");
return;
}
while (pCharacterHCTNQueue->pFront != NULL || !(pCharacterHCTNQueue->pFront == NULL && pInternalHCTNQueue->pFront->pNextNode == NULL)) {
HCTNode *pLeftNode = NULL;
HCTNode *pRightNode = NULL;
if (pCharacterHCTNQueue->pFront != NULL && (pInternalHCTNQueue->pFront == NULL || pCharacterHCTNQueue->pFront->weight <= pInternalHCTNQueue->pFront->weight)) {
pLeftNode = dequeueFromHTCNQueue(pCharacterHCTNQueue);
}
else {
pLeftNode = dequeueFromHTCNQueue(pInternalHCTNQueue);
}
if (pCharacterHCTNQueue->pFront != NULL && (pInternalHCTNQueue->pFront == NULL || pCharacterHCTNQueue->pFront->weight <= pInternalHCTNQueue->pFront->weight)) {
pRightNode = dequeueFromHTCNQueue(pCharacterHCTNQueue);
}
else {
pRightNode = dequeueFromHTCNQueue(pInternalHCTNQueue);
}
HCTNode *pInternalNode = createHCTNode('$', pLeftNode->weight + pRightNode->weight);
pInternalNode->pLeftNode = pLeftNode;
pInternalNode->pRightNode = pRightNode;
enqueueIntoHTCNQueue(pInternalHCTNQueue, pInternalNode);
}
pHCTree->pRoot = dequeueFromHTCNQueue(pInternalHCTNQueue);
}
void destroyHCTree(HCTree* pHCTree) {
if (pHCTree == NULL) {
fprintf(stderr, "ERROR: Failed to Destroy Huffman Coding Tree!\nCAUSE: Pointer to Huffman Coding Tree is NULL!\n");
return;
}
destroyHCTNodesInHCTree(pHCTree->pRoot);
free(pHCTree);
}
void destroyHCTNodesInHCTree(HCTNode* pHCTNode) {
if (pHCTNode == NULL) return;
destroyHCTNodesInHCTree(pHCTNode->pLeftNode);
destroyHCTNodesInHCTree(pHCTNode->pRightNode);
free(pHCTNode);
}