Как сдвинуть эту очередь приоритетов?

Моя программа должна сделать 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);
 }
}

Это должно помочь вам или, может быть, я не понял вашего вопроса. Пожалуйста, дайте мне знать, что вы думаете об этом.

Другие вопросы по тегам