burlakad написав:Встановлення в чергу виконується підряд в кінець черги, зняття – за пріоритетом. Черга організована на масиві або списку.
Пріоритет – мінімальне значення числового параметра, при збігу параметра – LIFO.
Буду вдячна за допомогу)
Допомога ще потрібна? Спробую допомогти з усим, крім готової програми (мені лінь її писати).
Що на даному етапі ви вмієте, а в чому ще треба розбиратися? Можете самостійно написати код для дій з однозв'язним списком (що для даної задачі, ІМНО, краще, ніж масив)? Пріоритетна черга відрізнятиметься від нього тим, що в вузлі буде ще одне поле для пріоритету:
typedef struct node
{
struct node *next;
int prio;
//тут має поле якогось типу, де зберігається значення елемента черги — наприклад, int value;
} NODE
Це вузол (у якому зберігається один елемент черги), а для організації черги треба зберігати вказівник на перший вузол. Також для швидкого додавання елементів зручно зберігати вказівник на кінець списку (це необов'язково, але інакше для цієї ж дії доведеться щоразу перебирати увесь список, що незовсім продуктивно).
typedef struct queue
{
NODE *first;
NODE **end; //Зверніть увагу: вказівник на вказівник
} QUEUE;
При створенні черги first має отримати значення NULL, end буде вказівником на нього:
QUEUE *q=malloc(sizeof(QUEUE));
q->first=NULL;
q->end=&(q->first);
Тоді вставка елемента в чергу виглядатиме так:
NODE* nd=malloc(sizeof(NODE));
nd->next=NULL;
nd->prio=якийсь_пріоритет;
nd->value=якесь_значення;
*(q->end)=nd;
q->end=&(nd->next);
Тепер найважче — виймання елемента з урахуванням пріоритету:
//тут має бути перевірка: якщо q->first == NULL, вийняти елемент неможливо
NODE**curnode = &(q->first);
NODE** minnode=curnode;
//Пошук першого елемента з найменшим пріоритетом:
while(*curnode!=NULL)
{
if ((*curnode)->prio < (*minnode)->prio)
minnode=curnode;
curnode=&((*curnode)->next);
}
//Виймаємо знайдений елемент:
res = (*minnode)->value; //записуємо кудись його значення
NODE *tmp=*minnode;
*minnode=tmp->next;//видаляємо вузол із черги
free(tmp);//звільняємо пам'ять
//Мало не забув. Оскільки в нас іще є вказівник на вказівник на останній елемент черги,
//при вийманні кінцевого елемента слід подбати і про нього:
if(*minnode==NULL)
q->end=minnode;
Лишається все це дописати й по-людському оформити. Якщо щось незрозуміло/не працює/виникли питання — звертайтесь.