/*** Saeteurn, San ect_sfs@ecst.csuchico.edu 15b Program 5: Kwik-E-Mart Simulator ***/ #include "pqueue.h" Pqueue::~Pqueue()//Destructor { Node *cur = m_head; Node *tmp; while(cur!=NULL) { tmp = cur; delete tmp; cur = cur->m_next; } } bool Pqueue::enqueue(string name,bool type,int Atime,int items,int priority) { if(m_head==NULL)//Condition Checking: Empty Queue { m_tail = new Node(name,type,Atime,items,priority,NULL,NULL); m_head = m_tail; return true; } assert(m_tail!=NULL); if(m_tail->m_priority>priority)//Insert in middle { Node *cur; Node *check; for(cur=m_head;cur->m_next!=NULL&&cur->m_next->m_prioritym_next){} for(check=m_head;check!=NULL;check=check->m_next)//Checks if item is already in the Queue { if(check->m_cur->getName()==name && check->m_cur->getATime()==Atime) { return false; } } if(cur->m_next==NULL || m_head->m_priority>priority) { m_head = new Node(name,type,Atime,items,priority,m_head,NULL); m_head->m_next->m_prev = m_head; return true; } if(cur->m_next->m_priority==priority) { while(cur->m_next->m_priority==priority) { cur = cur->m_next; } Node *tmp = cur->m_next; cur->m_next = new Node(name,type,Atime,items,priority,cur->m_next,cur); tmp->m_prev = cur->m_next; return true; }//Insert at the end of Queue assert(cur->m_next->m_priority>priority); Node *tmp = cur->m_next; cur->m_next = new Node(name,type,Atime,items,priority,cur->m_next,cur); tmp->m_prev = cur->m_next; return true; } else { m_tail->m_next = new Node(name,type,Atime,items,priority,NULL,m_tail); m_tail = m_tail->m_next; return true; } } bool Pqueue::dequeue(string &name,bool &type,int &Atime,int &items,int &priority) { if(m_head==NULL)//Condition Empty Queue { return false; } assert(m_head->m_cur!=NULL); //Return item variables name = m_head->m_cur->getName(); type = m_head->m_cur->getType(); Atime = m_head->m_cur->getATime(); items = m_head->m_cur->getItem(); priority = getPriority(); delete m_head->m_cur; if(m_head->m_next!=NULL)//Condition One item in Queue { m_head->m_next->m_prev = NULL; } m_head = m_head->m_next; return true; } bool Pqueue::empty() { return m_head==NULL; } int Pqueue::size() { int count = 0; Node *cur = m_head; for(cur;cur!=NULL;cur=cur->m_next) { count++; } return count; } void Pqueue::print(ostream &os) { Node *cur; for(cur=m_head;cur!=NULL;cur=cur->m_next) { cur->m_cur->setDep(cur->m_priority+cur->m_cur->getItem()); cur->m_cur->print(os); } }