-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLinkedQueue.cpp
117 lines (104 loc) · 3.22 KB
/
LinkedQueue.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
//
// Created by Toby Dragon on 10/24/16.
//
#include "Queue.h"
#include "LinkedQueue.h"
template <class ItemType>
LinkedQueue<ItemType>::LinkedQueue(){
this->first = nullptr;
this->last = nullptr;
}
template <class ItemType>
LinkedQueue<ItemType>::~LinkedQueue(){
if (first != nullptr) {
if (first == last) { //list of one thing. need other case b/c the loop would go on forever
delete first;
} else {
while (first != nullptr) {
LinkedNode<ItemType> *temp = first->getNext();
delete first;
first = temp;
}
}
}
first = nullptr;
last = nullptr;
}
template <class ItemType>
void LinkedQueue<ItemType>::enqueue(ItemType item){
LinkedNode<ItemType>* next = new LinkedNode<ItemType>(item);
if (isEmpty()) {
first = next;
last = next;
}
else if (last != nullptr) {
last->setNext(next);
}
}
template <class ItemType>
ItemType LinkedQueue<ItemType>::dequeue() {
if (isEmpty()) {
throw std::out_of_range("Queue is empty");
}
ItemType item = first->getItem();
LinkedNode<ItemType>* temp = first->getNext();
delete first;
first = temp;
return item;
}
template <class ItemType>
bool LinkedQueue<ItemType>::isEmpty(){
return first == nullptr;
}
template <class ItemType>
LinkedQueue<ItemType>::LinkedQueue(const LinkedQueue<ItemType>& queue) {
if (queue.first != nullptr) {
this->first = new LinkedNode<ItemType>(*queue.first);
this->last = this->first;
LinkedNode<ItemType>* current = queue.first;
LinkedNode<ItemType>* currentInThis = first;
while (current->getNext() != nullptr) {
current = current->getNext();
currentInThis->setNext(new LinkedNode<ItemType>(current->getItem()));
currentInThis = currentInThis->getNext();
}
} else {
this->first = nullptr;
this->last = nullptr;
}
}
template <class ItemType>
LinkedQueue<ItemType>& LinkedQueue<ItemType>::operator=(LinkedQueue<ItemType> queue) {
if (&queue != this) {
//delete current info
if (first != nullptr) {
if (first == last) { //list of one thing. need other case b/c the loop would go on forever
delete first;
} else {
while (first != nullptr) {
LinkedNode<ItemType> *temp = first->getNext();
delete first;
first = temp;
}
}
}
first = nullptr;
last = nullptr;
//set things equal
if (queue.first != nullptr) {
this->first = new LinkedNode<ItemType>(*queue.first);
this->last = this->first;
LinkedNode<ItemType>* current = queue.first;
LinkedNode<ItemType>* currentInThis = first;
while (current->getNext() != nullptr) {
current = current->getNext();
currentInThis->setNext(new LinkedNode<ItemType>(current->getItem()));
currentInThis = currentInThis->getNext();
}
} else {
this->first = nullptr;
this->last = nullptr;
}
}
return *this;
}