Почему BSD queue.h LIST называется списком?
Мой "родной язык" - Java, и мне нужно написать проект на C в образовательных целях. Я пытаюсь понять queue.h
библиотека. В Java по умолчанию вы add()
предмет до конца List
Однако в queue.h
есть только LIST_INSERT_HEAD
макрос, который не принимает других участников. На самом деле небольшой тест показывает, что он вставляется в HEAD (при перемещении с LIST_FOREACH
он идет от последнего вставленного элемента к первому). Итак, разве это не должно называться очередью FILO (что означает стек)?
3 ответа
Список в Java соответствует списку ADT: "упорядоченная последовательность значений, где одно и то же значение может встречаться более одного раза".
LIST в queue.h также является списком ADT, в котором вы можете увидеть детали реализации (он реализован в виде двусвязного списка). Это LIFO, как говорится в самом файле queue.h (хотя и довольно мрачно). И да, один из способов реализации ADT в стеке - использование связанного списка.
Вы должны были пропустить других, должен присутствовать INSERT_TAIL. Пожалуйста, найдите и подтвердите это.
Он имеет как функциональные возможности, список и очередь:)
Может быть ниже, это не тот, который вы ищете, в любом случае http://bxr.su/o/queue.h
Есть несколько вариантов очереди, предоставляемых queue.h
,
Так как все это делается препроцессором, а также обратите внимание, что полный путь к файлуsrc/sys/sys/queue.h
в каждой системе BSD, что означает, что она интенсивно используется в ядре для внутренних структур, каждый вариант высоко оптимизирован для эффективности и минимального использования памяти.
Похоже, что в OpenBSD есть несколько вариантов выбора очередей (каждая BSD-система может иметь немного другой выбор):
- http://bxr.su/o/queue.h#SLIST_HEAD
- http://bxr.su/o/queue.h#LIST_HEAD
- http://bxr.su/o/queue.h#SIMPLEQ_HEAD
- http://bxr.su/o/queue.h#XSIMPLEQ_HEAD*
- http://bxr.su/o/queue.h#TAILQ_HEAD
- http://bxr.su/o/queue.h#CIRCLEQ_HEAD*
* По какой-либо причине кажется, что в настоящее время только 4 из 6 вариантов официально зарегистрированы на странице руководства.Смотрите: http://bxr.su/o/share/man/man3/queue.3
Если вы хотите быть в состоянииINSERT_TAIL
в очередь / список, у вас все еще есть много вариантов для выбора здесь -SIMPLEQ
, XSIMPLEQ
, TAILQ
а также CIRCLEQ
,
Итак, взаключение: нет закона, который говорит, что реализация очереди / списка по имениLIST
должен разрешить вставку хвоста!