2013-11-27 4 views
0

Моя программа должна делать 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» слева, так что, когда элемент удаляется из очереди , процесс смещения будет выполнен, таким образом, у нас не будет никакого пустого пространства в массиве, и мы все равно можем добавить элемент ...

ну это было все, что я хотел сделать, но я пробовал разные способы & Я не мог делать то, что хотел ... Теперь я не имею ни малейшего представления о том, что я должен делать! :(бы у пожалуйста, скажите, что я должен делать (как добавить знак и сдвиг элементов)?

ответ

0

Я не уверен, чтобы понять, почему вам нужен этот знак marquing и диафрагменное Indice.

Что об изменении вашего функция удаления, так что на самом деле удалить элемент, сдвигая queu и уменьшения счетчика г?

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); 
} 
} 

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

+0

tnx это был хороший способ, но объяснение, которое я дал abou t положить знак и ... это способ, которым наш профессор сказал нам делать и называется логическим удалением !!! в логическом удалении знак пустынных домов будет 0, а знак заполненных домов будет 1, тогда мы будем искать в очереди, чтобы увидеть, равен ли знак 0 или 1, если бы у нас было 1 после 0 мы будем нажимать на дом со знаком «1» слева ... так что дом с знаком «0» будет удален, и у нас не будет никакого пустого места в массиве! –

+0

ОК после: при вводе изменить значение знака на 1. при удалении изменить значение знака элемента [f] на 0. добавить функцию очистки, проходящую через ваш список, и заменить все 0-маркированный элемент по первый справа от него. Затем вам нужно будет вызвать эту функцию, по крайней мере, каждый раз, когда вы удаляете элемент (или каждый оборот вашего цикла). –

+0

Да, сначала я это сделал, но я столкнулся с ошибкой: (функция insert стала бесконечным циклом, я имею в виду, что я мог вставлять элементы, не учитывая определенную сумму: SIZE! Я думаю, моя функция была неправильной или что-то в этом роде. Помогите мне с этой функцией? –

Смежные вопросы