-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquadstack.cpp
127 lines (109 loc) · 2.64 KB
/
quadstack.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
121
122
123
124
125
126
127
#include "quadstack.h"
#include "quadtritree.h"
QuadStack::QuadStack() : head(NULL), tail(NULL), size(0) {};
QuadStack::~QuadStack(){
DeleteAll();
};
int QuadStack::Size(){
return size;
};
bool QuadStack::IsEmpty(){
return !head;
};
void QuadStack::DeleteAll(){
// QuadTriNodePtr temp;
while (!IsEmpty())
pop();
};
void QuadStack::UnlinkNode(QuadStackNode* qnode){
if (qnode)
{
if ( qnode == head )
{
if ( Size() == 1 )
head = tail = NULL;
else
{
head = head->next;
head->prev = NULL;
}
size--;
}
else
if ( qnode == tail )
{
if ( Size() == 1 )
head = tail = NULL;
else
{
tail = tail->prev;
tail->next = NULL;
}
size--;
}
else
{ // somewhere in the sprawling metropolis
qnode->prev->next = qnode->next;
qnode->next->prev = qnode->prev;
size--;
}
qnode->next = NULL;
qnode->prev = NULL;
qnode->diamond->queue = NULL;
qnode->diamond->queueloc = NULL;
qnode->diamond = NULL;
// delete qnode;
}
};
QuadStackNode* QuadStack::begin(){
return head;
};
QuadStackNode* QuadStack::end(){
return tail;
};
QuadStackNode* QuadStack::push(QuadTriTree* qtnode){ //Returns address of QueueNode if successful
QuadStackNode* newNode;
newNode = new QuadStackNode;
newNode->diamond = qtnode;
newNode->prev = NULL;
if ( head )
{
newNode->next = head;
newNode->next->prev = newNode;
head = newNode;
}
else
{
head = tail = newNode;
newNode->next = NULL;
}
newNode->diamond->queueloc = newNode;
newNode->diamond->queue = this;
size++;
return head;
};
QuadTriTree* QuadStack::pop(){
QuadStackNode* temp;
QuadTriTree* diamond;
if (head == tail){ //Only one element in stack
temp = head;
head = tail = NULL;
diamond = temp->diamond;
temp->diamond = NULL;
temp->next = temp->prev = NULL;
//delete temp;
}
else{ //More than one element in stack
temp = head;
head = head->next;
head->prev = NULL; //Set new head element
temp->next = NULL;
diamond = temp->diamond;
temp->diamond = NULL;
//delete temp;
}
diamond->queue = NULL;
diamond->queueloc = NULL;
size--;
return diamond;
};