i'm trying to make this program which simulates a printing queue, a very basic level program that implements priority queues. i'm stuck in the last function, i.e. the simulate function, there's that while(temp!=NULL){...} loop in simulate function which works perfect the first time but turns into an infinite loop the next time it is in action, although i have double checked that temp==NULL condition does happen, but still loop continues, even putting an if(...){break;} statement does not stop this loop (of course the if(...) condition is satisfied the second time this loop is in action). please help, i am really stuck.
#include <conio>
#include <iostream>
#include <dos>
class pqueue
{
private:
enum status{Waiting,Printing,Printed};
struct node
{
int num;
int pri;
status state;
node *pre;
};
typedef node* pnode;
pnode front;
pnode rear;
int page;
public:
pqueue();
void enqueue();
void dequeue();
bool empty();
void display();
void null();
void simulate(int);
void update(int);
};
pqueue::pqueue()
{
front=NULL;
rear=NULL;
}
void pqueue::enqueue()
{
typedef node* pnode;
pnode temp;
temp=new node;
if(front==NULL)
{front=temp;}
cout<<"Enter number of pages to be printed: ";
cin>>temp->num;
do
{
cout<<"Enter priority (0-10) where 10 is highest: ";
cin>>temp->pri;
if((temp->pri<0)||(temp->pri>10))
{cout<<"Wrong priority\n";}
}while((temp->pri<0)||(temp->pri>10));
temp->state=Waiting;
temp->pre=NULL;
if(rear!=NULL)
{rear->pre=temp;}
rear=temp;
}
void pqueue::dequeue()
{
if(!empty())
{
typedef node* pnode;
pnode temp=front;
pnode ptr=NULL;
int pr=-1;
while(temp!=NULL)
{
if(temp->pri>pr)
{pr=temp->pri;}
temp=temp->pre;
}
temp=front;
while(temp->pri!=pr)
{
ptr=temp;
temp=temp->pre;
}
cout<<"Data deleted is: "<<temp->num<<endl;
cout<<"With priority: "<<temp->pri<<endl;
getch();
if(ptr==NULL)
{
front=temp->pre;
delete temp;
}
else if(temp->pre==NULL)
{
ptr->pre=NULL;
rear=ptr;
delete temp;
}
else
{
ptr->pre=temp->pre;
delete temp;
}
}
}
bool pqueue::empty()
{
if(front==NULL)
{
cout<<"Queue is empty\n";
getch();
return true;
}
else
{return false;}
}
void pqueue::display()
{
if(!empty())
{
typedef node* pnode;
pnode temp=front;
while(temp!=NULL)
{
cout<<"Total pages: "<<temp->num
<<" Priority value: "<<temp->pri
<<" Status: ";
if(temp->state==0)
{cout<<"| Waiting |\n";}
else if(temp->state==1)
{cout<<"| Printing |\n";}
else if(temp->state==2)
{cout<<"| Printed |\n";}
temp=temp->pre;
}
getch();
}
}
void pqueue::null()
{
while(!empty())
{
dequeue();
}
}
void pqueue::simulate(int tim)
{
if(!empty())
{
while(tim!=0)
{
typedef node* pnode;
pnode temp=front;
int pr=-1;
while(temp!=NULL)
{
if((temp->pri>pr)&&(temp->state!=2))
{pr=temp->pri;}
temp=temp->pre;
}
temp=front;
while(temp->pri!=pr)
{
temp=temp->pre;
}
if(temp->state==0)
{page=temp->num;}
if(page!=0)
{
temp->state=Printing;
while((tim!=0)&&(page!=0))
{
update(tim);
sleep(1);
page--;
tim--;
}
}
else if(page==0)
{temp->state=Printed;}
}
}
}
void pqueue::update(int tim)
{
clrscr();
cout<<"\n\t\tSIMULATION OF PRINTING QUEUE\n\n";
typedef node* pnode;
pnode temp=front;
while(temp!=NULL)
{
cout<<"Total pages: "<<temp->num
<<" Priority value: "<<temp->pri
<<" Status: ";
if(temp->state==0)
{cout<<"| Waiting |\n";}
else if(temp->state==1)
{cout<<"| Printing |\n";}
else if(temp->state==2)
{cout<<"| Printed |\n";}
temp=temp->pre;
}
cout<<"\n\t\tWait for "<<tim<<" seconds";
}
void main()
{
pqueue pq;
int sw_var,tim;
do
{
clrscr();
cout<<"contact: threat.alive@gmail.com\n";
cout<<"Copyright (C) 2009 Zain ul Abideen\n";
cout<<"\n\t\tIMPLEMENTATION OF PRINTING USING PRIORITY QUEUE\n\n"
<<"\tMENU\n"
<<"1. Enqueue\n"
<<"2. Dequeue\n"
<<"3. Display Queue\n"
<<"4. Make Null\n"
<<"5. Simulate Printing\n"
<<"6. Exit\n";
cin>>sw_var;
switch(sw_var)
{
case 1:
clrscr();
pq.enqueue();
break;
case 2:
clrscr();
pq.dequeue();
break;
case 3:
clrscr();
pq.display();
break;
case 4:
clrscr();
pq.null();
break;
case 5:
cout<<"Enter the duration of simulation (in seconds): ";
cin>>tim;
pq.simulate(tim);
break;
case 6:
break;
default:
cout<<"Invalid choice";
getch();
}
}while(sw_var!=6);
}