в твоём примере наблюдается смешение C и C++. Так, конечно, можно. Но данная задача такого смешения, в общем, не требует.
Для понимания лучше код на C, чтобы видна была суть, которая потеряется за лесом методов при использовании классов. Пример без ввода данных, который строит пустой список, затем проходит по нему, затем удаляет.
#include <stdlib.h>
#define N 10
/* структура пустого двунаправленного списка */
struct Item
{
struct Position *next;
struct Position *prev;
};
int main()
{
/* рабочий указатель и голова списка (указатель на начало) */
struct Item *p = NULL, *head = NULL;
int i;
/* создаём список длиной 10 */
for(i = 0; i < N; ++i)
{
/* создаём в памяти новый элемент (в С++ это делает new) */
p = (struct Item *)malloc(sizeof(struct Item));
if(p == NULL) return -1; /* ошибка выделения памяти */
/* добавляем элемент в начало списка */
p->prev = head; /* говорим, что предыдущим для нового будет старая голова */
if(head != NULL) head->next = p; /* говорим, что для головы следующим будет новый (если голова не пуста) */
p->next = NULL; /* для нового следующего пока нет */
/* теперь мы привязали новый к списку */
head = p; /* перемещаем голову на новый */
}
/* проход списка от начала в конец */
p = head;
if(p != NULL) /* если список не пуст */
{
while(p->prev != NULL) /* идём до последнего элемента, у которого уже нет предыдущего */
p = p->prev;
head = p; /* теперь голова в хвосте */
}
/* проход списка в обратном направлении */
if(p != NULL) /* если список не пуст */
{
while(p->next != NULL) /* идём в обратную сторону до первого элемента, у которого нет следующего */
p = p->next;
head = p; /* теперь голова в начале */
}
/* вставим в середину элемент */
if(head != NULL) /* подвинем голову куда-нибудь в середину */
for(i = 0; i < 5 && head->prev != NULL; ++i)
head = head->prev;
/* создаём новый */
p = (struct Item *)malloc(sizeof(struct Item));
if(p == NULL) return -1; /* ошибка выделения памяти */
/* вставляем новый между головой и следующим за ней элементом */
p->next = head->next; /* ссылки нового на своих соседей */
p->prev = head;
/* ссылки соседей на нового */
if(head->next != NULL) head->next->prev = p;
head->prev = p;
/* теперь связь между head и head->next разорвана и замкнута на новый элемент с обоих концов */
/* удаление из середины элемента */
p = head->prev; /* его будем удалять */
/* замыкаем ссылки с головы и элемента через один от голову друг на друга */
if(p != NULL)
{
/* голова ссылается на предыдущий перед удаляемым */
if(p->prev != NULL) head->prev = p->prev;
/* предыдущий перед удаляемым ссылается на голову */
if(head->prev != NULL) head->prev->next = head;
free(p); /* удаляем в (C++ это делает delete) */
}
/* удаление списка */
while(head != NULL)
{
p = head;
head = head->prev; /* сместили голову на один вперёд, а p остался на крайнем элементе, теперь его удалим */
free(p);
}
}
Код написан без проверки, так что может где и ошибся, но вроде должно работать.