Как бы вы реализовали приоритетную очередь, используя связанный список в C?
Типичный связанный список состоит из head
, указывающего на элемент, который указывает на другой элемент (ы), который в конце концов заканчиваетсяNULL
или хвостом связанного списка.Пример:
(Linked List | Head) ----> (Element | Next) ----> (Element | Next) ----> Null
В базовом сценарии новые элементы добавляются в список с помощью функции «первым пришел - первым обслужен» (добавить в конец списка, удалить из передней части списка) FIFOподход.
В моем случае, однако, значение приоритета должно быть принято во внимание.Более конкретно, каждому элементу может быть назначен приоритет 1, 2 или 3. Элементы с наивысшим приоритетом добавляются в начало списка, а элементы с более низким приоритетом добавляются в конец.Вставки в список поддерживают порядок FIFO каждого приоритета.
Итак, если нужно ставить в очередь следующие элементы по одному:
a 3, b 1, c 2, d 3, e 2
Выходные данные должны быть: a 3, d 3, c 2, e 2, b 1
(упорядочено по приоритету, а также по порядку добавления вместо стандартного подхода «первым пришел - первым обслужен», который игнорирует приоритет).
Вот то, что у меня есть, но оно НЕ имеет приоритета.Как бы вы реализовали приоритетную очередь?
http://codepad.org/BMeuSgNBxd
Одним из способов было бы использование алгоритма сортировки / приоритета.Помимо алгоритма, некоторые из основных неизвестных / путаницы для меня - это то, как и где будет храниться приоритет, будет ли он находиться внутри фактического элемента, такого как:
(Linked List | Head) ---->(a | 1 | Next) ----> (b | 2 | Next) ----> Null
или
q_enqueue(&q, "a", "1");
q_enqueue(&q, "b", "2");
и как мне сравнивать приоритетыпри работе с указателями для создания алгоритма сортировки.