C связанный список, который зацикливается

#c #linked-list

#c #связанный список

Вопрос:

Существует ли какая-либо стандартная реализация связанного списка на C , в которой последний элемент указывает на первый? Поэтому, когда вы вызываете next для последнего элемента, вы возвращаетесь к первому. Похоже, это было бы очень полезно в играх, но я не знаю ни о какой реализации. спасибо.

Пример изображения

Комментарии:

1. Это циклический связанный список. Итак, как вы можете определить, что находитесь в конце списка??????

2. Что означает стандартный C ? Вы хотите знать, есть ли он уже в стандартной библиотеке? Или вы хотите знать, можете ли вы написать свой собственный список на C ?

3. boost::circular_buffer

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.