View difference between Paste ID: N56whwCW and EBuSQnVW
SHOW: | | - or go back to the newest paste.
1
#include <iostream>
2
#include <string>
3
#include <cassert>
4-
#include <cstdlib>
4+
5-
#include <ctime>
5+
6
7
8
struct Qnode{
9-
struct BST_Node {
9+
	string val;
10-
	string key;
10+
	Qnode* next;
11-
	// we'll ignore "stuff"
11+
12-
	string stuff;
12+
13-
	BST_Node* left;
13+
struct Queue{
14-
	BST_Node* right;
14+
	Qnode *first;
15
	Qnode *last;
16
};
17-
typedef BST_Node* BST;
17+
18
struct PQnode{
19-
void BST_init (BST& root) {
19+
	int priority;
20-
	root = NULL;
20+
	Queue q;
21
	PQnode* next;
22
23-
bool BST_isEmpty(BST root) {
23+
24-
	return NULL == root;
24+
25
typedef PQnode* PQ;
26
27-
bool BST_has(string key, BST curNode) {
27+
void initPQ (PQ& pq) {
28-
	if (BST_isEmpty(curNode)) { // i.e., NULL == ROOT
28+
	pq = NULL;
29-
		return false;
29+
30-
	} else if (key == curNode->key) {
30+
31-
		return true;
31+
bool isEmptyPQ (const PQ& pq){
32-
	} else if (key < curNode->key) {
32+
	return NULL == pq;
33-
		return BST_has (key,curNode->left);
33+
34-
	} else {
34+
35-
		return BST_has (key,curNode->right);
35+
void enterPQ (PQ& pq, string val, int priority) {
36
	Qnode *newQnode = new Qnode;
37
	newQnode->val = val;
38
	newQnode->next = NULL;
39-
BST BST_insert (string key, BST &curNode) {
39+
	if(isEmptyPQ(pq) || priority < pq->priority){
40-
	if (NULL == curNode) {
40+
		PQnode *newpq = new PQnode;
41-
		curNode = new BST_Node;
41+
		newpq->priority = priority;
42-
		curNode->key = key;
42+
		newpq->next = NULL;
43-
		curNode->left = NULL;
43+
		newpq->q.first = newQnode;
44-
		curNode->right = NULL;
44+
		newpq->q.last = newQnode;
45-
	} else if (key == curNode->key) {
45+
		newpq->next = pq;
46-
		cerr << "duplicate key: " << key << endl;
46+
		pq = newpq;
47-
		assert(false);
47+
48-
	} else if (key < curNode->key) {
48+
		PQnode *temp = pq;
49-
		curNode->left = BST_insert (key,curNode->left);
49+
		while(temp->next!=NULL && temp->next->priority <= priority){
50-
	} else {
50+
			temp = temp->next;
51-
		curNode->right = BST_insert(key,curNode->right);
51+
52
		if(temp->priority == priority){
53-
	return curNode;
53+
			temp->q.last->next = newQnode;
54
			temp->q.last = newQnode;
55
		}else{
56-
void BST_print(BST curNode) {
56+
			PQnode *newpq = new PQnode;
57-
	if (curNode != NULL) {
57+
			newpq->priority = priority;
58-
		BST_print (curNode->left);
58+
			newpq->next = NULL;
59-
		cout << curNode->key << endl;
59+
			newpq->q.first = newQnode;
60-
		BST_print (curNode->right);
60+
			newpq->q.last = newQnode;
61
			if(temp->next != NULL){
62
				newpq->next = temp->next;
63
			}
64-
string BST_lookup (const BST& root, string key) {
64+
			temp->next = newpq;
65-
	if (BST_isEmpty(root)) {
65+
66-
		return ""; // or "ERROR", or ... umm ...
66+
67-
	} else if (key == root->key) {
67+
68-
		return root->stuff;
68+
69-
	} else if (key < root->key) {
69+
string firstPQ (const PQ& pq){
70-
		return BST_lookup (root->left, key);
70+
	assert (!isEmptyPQ(pq));
71-
	} else {
71+
	return(pq->q.first->val);
72-
		return BST_lookup (root->right, key);
72+
73
74
void leavePQ (PQ& pq) {
75
	assert (!isEmptyPQ(pq));
76-
void BST_delete(string key, BST& tree) {
76+
	if(pq->q.first->next == NULL){
77-
	assert (!BST_isEmpty(tree));
77+
		PQnode *temppq = pq;
78-
	BST_Node *previousNode = tree;
78+
		pq=pq->next;
79-
	BST_Node *deleteNode = tree;
79+
		delete temppq->q.first;
80
		delete temppq;
81-
	while(deleteNode != NULL && key != deleteNode->key){
81+
82-
		if (key < deleteNode->key) {
82+
		Qnode *temp = pq->q.first;
83-
			previousNode = deleteNode;
83+
		pq->q.first = pq->q.first->next;
84-
			deleteNode = deleteNode->left;
84+
		delete temp;
85-
		} else {
85+
86-
			previousNode = deleteNode;
86+
87-
			deleteNode = deleteNode->right;
87+
int sizePQ (const PQ& pq) {
88
	if (isEmptyPQ(pq)) {
89
		return 0;
90-
	if (NULL == deleteNode) {
90+
91-
		return;
91+
	int numPQ = 0;
92
	PQnode *temp = pq;
93-
	if(deleteNode->left == NULL && deleteNode->right == NULL){
93+
	while(temp!= NULL){
94-
		//		cout << "Test: " << previousNode->left->key << deleteNode->key;
94+
		Qnode *tempQ = temp->q.first;
95-
		if(tree->key == deleteNode->key){
95+
		//cout << "Blah: " << tempQ->val << endl;
96-
			tree = NULL;
96+
		while(tempQ!=NULL){
97-
		}else if(previousNode->left != NULL && previousNode->left->key == deleteNode->key){
97+
			//cout << tempQ->val << endl;
98-
			previousNode->left=NULL;
98+
			numPQ++;
99
			tempQ = tempQ->next;
100-
			previousNode->right=NULL;
100+
101
		temp = temp->next;
102-
		delete deleteNode;
102+
103-
	}else if(deleteNode->left == NULL && deleteNode->right != NULL){
103+
	return numPQ;
104-
		if(tree->key == deleteNode->key){
104+
105-
			tree = deleteNode->right;
105+
106-
		}else if(previousNode->left != NULL && previousNode->left->key == deleteNode->key){
106+
int sizeByPriority (const PQ& pq, int priority) {
107-
			previousNode->left = deleteNode->right;
107+
	if (isEmptyPQ(pq)) {
108-
		}else if(previousNode->right != NULL && previousNode->right->key == deleteNode->key){
108+
		return 0;
109-
			previousNode->right = deleteNode->right;
109+
110
	int numPQ = 0;
111-
		delete deleteNode;
111+
	PQnode *temp = pq;
112-
	}else if(deleteNode->right == NULL && deleteNode->left != NULL){
112+
	while(temp->next!=NULL && temp->next->priority <= priority){
113-
		if(tree->key == deleteNode->key){
113+
		temp = temp->next;
114-
			tree = deleteNode->left;
114+
115-
		}else if(previousNode->right != NULL && previousNode->right->key == deleteNode->key){
115+
	if (NULL == temp || temp->priority != priority) {
116-
			previousNode->right = deleteNode->left;
116+
		return 0;
117-
		}else if(previousNode->left != NULL && previousNode->left->key == deleteNode->key){
117+
118-
			previousNode->left = deleteNode->left;
118+
	Qnode *tempQ = temp->q.first;
119
	while(tempQ!=NULL){
120-
		delete deleteNode;
120+
		numPQ ++;
121
		tempQ = tempQ->next;
122-
		BST_Node *switchNode = deleteNode->left;
122+
123-
		BST_Node *previousSwitchNode = deleteNode;
123+
	return numPQ;
124-
		while(switchNode->right != NULL){
124+
125-
			previousSwitchNode = switchNode;
125+
126-
			switchNode = switchNode->right;
126+
int numPriorities (const PQ& pq) {
127
	if (isEmptyPQ(pq)) {
128
		return 0;
129-
		if(deleteNode->key == previousSwitchNode->key){
129+
130-
			//previousSwitchNode->left = switchNode->left;
130+
	int numPQ = 0;
131-
			switchNode->right = deleteNode->right;
131+
	PQnode *temp = pq;
132-
			if(tree->key == deleteNode->key){
132+
	while(temp!=NULL){
133-
				tree = switchNode;
133+
		numPQ ++;
134-
				delete deleteNode;
134+
		temp = temp->next;
135-
			}else{
135+
136-
				if(previousNode->left == NULL || previousNode->left->key == deleteNode->key){
136+
	return numPQ;
137-
					previousNode->left = switchNode;
137+
138-
				}else if(previousNode->right == NULL || previousNode->right->key == deleteNode->key){
138+
139-
					previousNode->right = switchNode;
139+
void CGprint(const PQ& pq){
140-
				}
140+
	PQ temp=pq;
141-
				delete deleteNode;
141+
	while(temp!=NULL){
142
		//cout<<"priority "<<temp->priority<<". Priority size: "<<sizeByPriority(pq, temp->priority)<<" :"<<endl;
143
		Qnode* iter=temp->q.first;
144-
			previousSwitchNode->right = switchNode->left;
144+
		while(iter!=NULL){
145-
			switchNode->left = deleteNode->left;
145+
			cout<<iter->val<<endl;
146-
			switchNode->right = deleteNode->right;
146+
			iter=iter->next;
147-
			if(tree->key == deleteNode->key){
147+
148-
				tree = switchNode;
148+
		temp=temp->next;
149-
				delete deleteNode;
149+
150-
			}else{
150+