-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathordered_list.c
75 lines (65 loc) · 1.65 KB
/
ordered_list.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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "ordered_list.h"
/*Initializes and allocates the linked list structure*/
LinkedList *createList()
{
LinkedList* list = (LinkedList *)malloc(sizeof(LinkedList));
if(list == NULL)
{
perror("malloc");
return NULL;
}
list -> head = NULL;
list -> size = 0;
return list;
}
/* Adds a huffman node into the linked list, in ascending frequency
* * In the result of a frequency tie, it is checked and added in terms
* * of ASCII index value */
void add(LinkedList *l, HuffmanNode *hnode)
{
Node* current;
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->item = hnode;
newNode->next = NULL;
if (l->head == NULL)
{
l->head = newNode;
l->size++;
return;
}
if (hnode->freq < l->head->item->freq ||
(hnode->freq == l->head->item->freq && hnode->c < l->head->item->c))
{
newNode->next = l->head;
l->head = newNode;
l->size++;
return;
}
current = l->head;
while (current->next != NULL &&
(current->next->item->freq < hnode->freq ||
(current->next->item->freq == hnode->freq &&
current->next->item->c < hnode->c)))
{
current = current -> next;
}
newNode -> next = current -> next;
current -> next = newNode;
l->size++;
}
/* Removes the head of the linkedlist
* * Sets the head to the next element */
Node *pop(LinkedList *l)
{
Node *removedNode;
if (l->head == NULL) {
return NULL;
}
removedNode = l->head;
l->head = l->head->next;
l->size--;
return removedNode;
}