ЗАДАЧА: Я работаю над домашней работой для своего класса колледжа структуры и алгоритмов. Задача состоит в том, чтобы реализовать приоритетную очередь в C с использованием кучи и сформировать основную, чтобы она могла поддерживать такие операции, как: INSERT s (вставляет строку s в приоритетную очередь) DELETE (удаляет элемент с самым низким приоритетом) NUMBER (возвращает количество элементов в приоритетной очереди) Мы также должны распечатывать предзаказ очереди приоритетов каждый раз, когда пишем операцию в основном. Можно предположить, что куча реализована с помощью указателей. Поэтому я реализовал его в структуре, которая выглядит следующим образом:
typedef char* elementtype;
typedef struct celltag {
elementtype zapis;
struct celltag *left, *right, *parent;
} celltype;
typedef celltype* node;
typedef celltype* PriorityQueue;
Я также реализовал следующие функции:
void PrMakeNull(PriorityQueue *Ap)
int PrEmpty(PriorityQueue A)
void PrInsert(elementtype x, PriorityQueue *Ap)
elementtype PrDeleteMin(PriorityQueue *Ap)
void Preorder(PriorityQueue A)
ВОПРОС: Я должен реализовать «функцию нумерации» с таким заголовком:
int Number(PriorityQueue P)
Функция не должна изменять приоритетную очередь A после вызова номера (A). Кроме того, функция должна быть независимой от реализации Приоритетной очереди. (Я думаю, это означает, что я должен использовать только PrMakeNull, PrEmpty, PrInsert, PrDeleteMin). Это вообще возможно? Как я мог это сделать? Как это должно выглядеть? ЧТО Я ПОПРОБОВАЛ: 1)
//This one is independent on Priority Queue implementation but destroys the Priority Queue.
int Number(PriorityQueue P){
PriorityQueue S;
PrMakeNull(&S);
int counter=0;
while(!PrEmpty(P))
{
PrInsert(PrDeleteMin(&P), &S);
counter++;
}
while(!PrEmpty(S))
{
PrInsert(PrDeleteMin(&S), &P);
}
return counter;
}
2)
//This one is dependent on Priority Queue implementation but doesn't destroy the Priority Queue.
int Number(PriorityQueue A){
int returning_number=1;
if (A == NULL)
return 0;
if(A->left!=NULL)
returning_number+=Number(A->left);
if(A->right!=NULL)
returning_number+=Number(A->right);
return returning_number;
}