-
Notifications
You must be signed in to change notification settings - Fork 1
/
DCLL.cpp
121 lines (107 loc) · 2.48 KB
/
DCLL.cpp
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// project/DCLL.cpp
// Doubly Circular Linked List
// ----------------------------------------------
// Authors: Sui Fung Alex Wong, Jasjeet Dhaliwal
// Date: 11/23/2015
#include "DCLL.hpp"
/*
* This function inserts a node containing a Process into the DCLL.
* Complexity: O(1)
* Input: data
* Output: none
*/
void DCLL::insertNode(Process * data) {
DCLLNode *node = new DCLLNode();
node->setData(data);
if (_size == 0) {
_head = node;
_tail = node;
node->setPrev(_tail);
node->setNext(_head);
} else {
_tail->setNext(node);
node->setPrev(_tail);
_tail = node;
_head->setPrev(_tail);
_tail->setNext(_head);
}
++_size;
}
/*
* This function removes a specific node from DCLL.
* Complexity: O(1)
* Input: node to remove
* Output: none
*/
void DCLL::removeNode(DCLLNode * node) {
DCLLNode *next, *prev;
if (_size == 0) {
return;
} else if (_size == 1) {
_head = NULL;
_tail = NULL;
} else if (_size > 1) {
prev = node->getPrev();
next = node->getNext();
prev->setNext(next);
next->setPrev(prev);
if (node == _head) {
_head = next;
} else if (node == _tail) {
_tail = prev;
}
}
delete node;
--_size;
}
/*
* This function gets the head of DCLL.
* Complexity: O(1)
* Input: none
* Output: head
*/
DCLLNode * DCLL::getHead() {
return _head;
}
/*
* This function gets the tail of DCLL.
* Complexity: O(1)
* Input: none
* Output: tail
*/
DCLLNode * DCLL::getTail() {
return _tail;
}
/*
* This function gets the size of DCLL.
* Complexity: O(1)
* Input: none
* Output: size
*/
int DCLL::getSize() {
return _size;
}
/*
* This function checks whether DCLL is empty or not.
* Complexity: O(1)
* Input: none
* Output: true if empty, else false
*/
bool DCLL::isEmpty() {
return _size == 0;
}
/*
* This function gets the total waiting time of all the processes in the DCLL.
* Complexity: O(n)
* Input: none
* Output: total waiting time
*/
int DCLL::getTotalTime() {
DCLLNode *temp = _head;
int total_time = 0;
for (int i = 0; i < _size; ++i) {
total_time += temp->getData()->get_waiting_time();
temp = temp->getNext();
} return total_time;
}