Создать круговой связанный список с помощью std :: list? - PullRequest
0 голосов
/ 10 июля 2020

Итак, мне было интересно, есть ли способ создать круговой связанный список с помощью std :: list в c ++ . Кажется, я не могу понять, как заставить последний элемент указывать на первый. Есть идеи, как это сделать?

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Интерфейс std :: list не поддерживает циклический список, где first.prev - указатель на последний, а last.next - указатель на первый.

Вы не можете уменьшить итератор, возвращаемый std :: list :: begin (). В более общем плане вы не можете уменьшить любой итератор, возвращаемый std :: ... :: begin ().

Увеличение итератора, возвращаемого std :: list :: back (), приводит к итератору == std :: list :: end () (то же самое в целом и для std :: ... :: back ()).

Если вам интересно, шаблон Visual Studio реализует std :: list внутренне, используя фиктивный узел как часть кругового двусвязного списка. dummy.next указывает на first, dummy.prev указывает на last, а first.prev == last.next == указатель на фиктивный узел, но это не позволяет вам рассматривать его как обычный круговой двусвязный список.

1 голос
/ 10 июля 2020

Нет, нет.

std::list не позволяет вам самостоятельно управлять ссылками. Список контролирует ссылки для вас. Вы не можете настроить их.

Обратите внимание, что если вы можете настраивать ссылки в списке, функции в списке, вероятно, будут работать некорректно. Например, если вы перебираете круговой список, вы никогда не закончите sh!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...