#c #linked-list
#c #связанный список
Вопрос:
Существует ли какая-либо стандартная реализация связанного списка на C , в которой последний элемент указывает на первый? Поэтому, когда вы вызываете next для последнего элемента, вы возвращаетесь к первому. Похоже, это было бы очень полезно в играх, но я не знаю ни о какой реализации. спасибо.
Комментарии:
1. Это циклический связанный список. Итак, как вы можете определить, что находитесь в конце списка??????
2. Что означает стандартный C ? Вы хотите знать, есть ли он уже в стандартной библиотеке? Или вы хотите знать, можете ли вы написать свой собственный список на C ?
4. Такое поведение должно быть очень легко эмулировать с помощью
std::vector
и некоторой базовой модульной арифметики.
Ответ №1:
Существует ли какая-либо стандартная реализация связанного списка на C , в которой последний элемент указывает на первый?
Нет. Стандартная библиотека C не имеет реализации такой структуры данных.
Ответ №2:
Visual Studio реализует std::list с двусвязным списком циклического типа с фиктивным узлом, который указывает на первый и последний фактические узлы в списке. Это не настоящий циклический список, поскольку предыдущий указатель первого узла и следующий указатель последнего узла указывают на фиктивный узел (в отличие друг от друга). В случае Visual Studio std::list::end() является итератором для фиктивного узла, и поэтому он является фиксированным итератором после создания списка. Обратите внимание, что итератор до последнего узла может быть увеличен до std::list::end() , фиктивного узла, но итератор до первого узла не может быть уменьшен.
Вы всегда можете создать свой собственный класс для настоящего кругового одно- или двусвязного списка.
Ответ №3:
Вы можете легко найти, какие контейнеры доступны в стандартной библиотеке C на cppreference.com ; в частности, на странице, посвященной контейнерам…
… и действительно, стандартная библиотека не имеет реализации кругового списка.
В более общем плане — стандартная библиотека не реализует так много контейнеров и несколько вариантов контейнеров одного и того же типа. Вам лучше поискать в популярных библиотеках, таких как Boost, или на GitHub, или даже запросить рекомендации в Software Recommendations Stack Exchange.