Как сдвинуть эту очередь приоритетов?
Моя программа должна сделать 4 операции: add
, delete
, show
а также exit
используя очередь приоритетов... вот код:
#include<iostream>
#include<conio.h>
using namespace std;
#define SIZE 5 /* Size of Queue */
int f=0,r=-1; /* Global declarations */
typedef struct PRQ
{
int ele;
int pr;
int sign;
}PriorityQ;
PriorityQ PQ[SIZE];
//***************************************************
void PQinsert(int elem, int pre)
{
int i; /* Function for Insert operation */
if( r==SIZE-1)
printf("\n\n Overflow!!!!\n\n");
else
{
i=r;
++r;
while(PQ[i].pr >= pre && i >= 0) /* Find location for new elem */
{
PQ[i+1]=PQ[i];
i--;
}
PQ[i+1].ele=elem;
PQ[i+1].pr=pre;
}
}
//***************************************************
PriorityQ PQdelete()
{ /* Function for Delete operation */
PriorityQ p;
if(f > r)
{
printf("\n\nUnderflow!!!!\n\n");
p.ele=-1;p.pr=-1;
return(p);
}
else
{
p=PQ[f];
f=f+1;
return(p);
}
}
//***************************************************
void display()
{ /* Function to display status of Queue */
int i;
if(r==SIZE-1)
printf(" \n Empty Queue\n");
else
{
printf("Front->");
for(i=f;i<=r;i++)
printf("[%d,%d] ",PQ[i].ele,PQ[i].pr);
printf("<-Rear");
}
}
//***************************************************
int main()
{ /* Main Program */
int opn;
PriorityQ p;
do
{
system("cls");
printf("\n ### Priority Queue Operations(DSC order) ### \n\n");
printf("\n Press 1-Insert, 2-Delete,3-Display,4-Exit\n");
printf("\n Your option ? ");
scanf("%d",&opn);
switch(opn)
{
case 1:
printf("\n\nRead the element and its Priority?");
scanf("%d%d",&p.ele,&p.pr);
PQinsert(p.ele,p.pr); break;
case 2:
p=PQdelete();
if( p.ele != -1)
printf("\n\nDeleted Element is %d \n",p.ele);
break;
case 3:
printf("\n\nStatus of Queue\n\n");
display();
break;
case 4:
printf("\n\n Terminating \n\n");
break;
default:
printf("\n\nInvalid Option !!! Try Again !! \n\n");
break;
}
printf("\n\n\n\n Press a Key to Continue . . . ");
getch();
}
while(opn != 4);
}
Теперь я хочу добавить знак, чтобы при вставке элемента знак этого элемента в массиве становился равным 1, а когда элемент был удален, его знак становился равным 0... тогда я хочу сместить дома, имеющие знак '1'слева, так что когда элемент будет удален из очереди, будет выполнен процесс смещения, таким образом у нас не будет пустого пространства в массиве, и мы все равно сможем добавить элемент...
ну, это было все, что я хотел сделать, но я пытался по-разному, и я не мог делать то, что хотел... Теперь я понятия не имею, что мне делать!!:(Не могли бы вы сказать, что мне делать (как добавить элементы sign и shift)?
1 ответ
Я не уверен, что понимаю, зачем вам этот знак маркировки и индекс.
Как насчет изменения вашей функции удаления, чтобы она действительно удаляла элемент, сдвигая очередь и уменьшая количество r?
PriorityQ PQdelete()
{ /* Function for Delete operation */
PriorityQ p;
int neshane;
int loop_var;
if(f > r)
{
printf("\n\nUnderflow!!!!\n\n");
p.ele=-1;p.pr=-1;
return(p);
}
else
{
p=PQ[0];
// if one element: just reduce the count of element
if(r==0)
r--;
else
// if more than one: shift all elements to the left and reduce the count
{
for(loop_var=0; loop_var<r; loop_var++)
{
PQ[loop_var+1] = PQ[loop_var];
}
r--;
}
return(p);
}
}
Это должно помочь вам или, может быть, я не понял вашего вопроса. Пожалуйста, дайте мне знать, что вы думаете об этом.