Добавил:
13246980
Оставь надежду всяк сюда поступивший
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Синников С++ / 2 курс / С++ / 6,2 / main
.cpp/*9.Дан непустой двусвязный список, первый, последний и текущий элементы которого имеют
адреса P1, P2 и P3. Также даны пять чисел. Используя тип TList, описать
процедуру InsertAfter(L, D), которая вставляет новый элемент со значением D после
текущего элемента списка L (L — входной и выходной параметр типа TList, D — входной
параметр целого типа). Вставленный элемент становится текущим. С помощью этой
процедуры вставить пять данных чисел в исходный список.*/
#include <iostream>
#include <locale>
using namespace std;
/// класс List - собственно исходный двусвязный список с которым будем работать дальше --------------------
struct PNode //Структура являющаяся звеном списка
{
int x; //Значение x будет передаваться в список
PNode *Next,*Prev; //Указатели на адреса следующего и предыдущего элементов списка
};
class List //Создаем тип данных Список
{
public:
PNode *Head,*Tail; //Указатели на адреса начала списка и его конца
List():Head(NULL),Tail(NULL){}; //Инициализируем адреса как пустые
~List(); //Деструктор
void Show(); //Функция отображения списка на экране
void Add(int x); //Функция добавления элементов в список
};
List::~List() //Деструктор
{
while (Head) //Пока по адресу на начало списка что-то есть
{
Tail=Head->Next; //Резервная копия адреса следующего звена списка
delete Head; //Очистка памяти от первого звена
Head=Tail; //Смена адреса начала на адрес следующего элемента
}
}
void List::Add(int x)
{
PNode *temp=new PNode; //Выделение памяти под новый элемент структуры
temp->Next=NULL; //Указываем, что изначально по следующему адресу пусто
temp->x=x;//Записываем значение в структуру
if (Head!=NULL) //Если список не пуст
{
temp->Prev=Tail; //Указываем адрес на предыдущий элемент в соотв. поле
Tail->Next=temp; //Указываем адрес следующего за хвостом элемента
Tail=temp; //Меняем адрес хвоста
}
else //Если список пустой
{
temp->Prev=NULL; //Предыдущий элемент указывает в пустоту
Head=Tail=temp; //Голова=Хвост=тот элемент, что сейчас добавили
}
}
void List::Show()
{
//ВЫВОДИМ СПИСОК С НАЧАЛА
PNode *temp=Head; //Временно указываем на адрес первого элемента
while (temp!=NULL) //Пока не встретим пустое значение
{
cout<<temp->x<<" "; //Выводим каждое считанное значение на экран
temp=temp->Next; //Смена адреса на адрес следующего элемента
}
cout<<"\n";
}
///--------------------------------------------------------------------------------------------------------
//собственно - запись Tlist с полями first last и current и с методом вставки после текущего элемента
typedef struct TList
{
PNode *first,*last,*current;
void insertAfter(List &list,int x)
{
if(current == list.Tail) //если текущий совпадает с конечным
{
list.Add(x); //то добавляем элемент в конец списка
current = list.Tail; //и перемещаем указатель Текущий на Последний элемент списка
}
else //иначе
{
PNode *temp = new PNode; //выделяем память для нового элемента
//перемещаем указатели так, чтобы после текущего был введенный элемент, а после введенного - следующий ранее за текущем
temp->x = x;
temp->Next = current->Next;
temp->Prev = current;
current->Next->Prev=temp;
current->Next = temp;
current=temp;
}
}
}TList;
int main()
{
setlocale(LC_ALL,"RUS");
cout << "Введите кол-во элементов в списке: " << endl;
int n; cin>>n;
List list;
cout << "Введите элементы списка через пробел: " << endl;
for(int i=0;i<n;i++)
{
int tmp; cin>>tmp; //переменная для ввода
list.Add(tmp);//добавляем в список
}
cout << "Получившийся список: "<< endl;
list.Show();
TList tlist;
tlist.first=list.Head; //указатель на первый элемент = указатель на первый элемент списка
tlist.last = list.Tail; //указатель на последний элемент
cout <<"Введите номер элемента, который хотите сделать текущем (после которого будете добавлять следующие элементы)"<<endl;
int numb; cin>>numb;
tlist.current=list.Head;
for(int i=0;i<numb-1;i++) //цикл до нужного элемента numb
{
if(tlist.current->Next!=NULL)tlist.current=tlist.current->Next; //передвигаем указатель до тех пор пока он не будет указывать на нужный элемент
}
cout <<"адрес первого элемента: " << &tlist.first<<" -> "<<tlist.first->x<<endl;
cout <<"адрес последнего элемента: " << &tlist.last<<" -> "<<tlist.last->x<<endl;
cout <<"адрес текущего элемента: " << &tlist.current<<" -> "<<tlist.current->x<<endl;
cout<<"Введите 5 чисел через пробел"<<endl;
for(int i=0;i<5;i++)
{
int tmp; cin>>tmp; //ввод i-го элемента из 5
tlist.insertAfter(list,tmp);
}
cout << "Получившийся список: "<< endl;
list.Show();
return 0;
}