Этот код имеет несколько проблем. Во-первых, если вы собираетесь часто выполнять «insertAfterLast», вы должны использовать «top-> prev», чтобы получить указатель на последний элемент в постоянном времени; в противном случае построение списка потребует квадратичного (O (n ^ 2)) времени. Во-вторых, в любом реальном проекте реализация кругового связанного списка с нуля почти наверняка является плохой идеей - вместо этого вы хотите использовать зрелый STL-совместимый контейнер, такой как std :: deque или Boost's round_buffer .
Предполагая, что вы действительно хотите это сделать, и вас не беспокоят пустые списки, ваша функция, представленная выше, кажется, уже полностью верна. Скорее всего, проблема в том, что ваш начальный список перед началом работы искажен, или, более вероятно, в том, что когда вы перебираете список, чтобы распечатать его в конце, вы пропускаете последний элемент. Правильный способ перебора циклически связанного списка выглядит следующим образом (адаптировано из Wikipedia ):
Node* Q = top;
do {
cout << Q->stId << endl;
Q = Q->next;
} while (Q != top);