#include <stdio.h>
#include <iostream>
using namespace std; //использование стандартного пространства имён для использования cin, cout, cin.get()
class Statue //класс "Статуя", можешь вместо этого писать структуру
{
public:
char Author[80];
char Mesto[80];
long int Date;
char Izobr[80];
};
//Собственно класс "СПИСОК". Односвязный:))
class List
{
private:
class Element //вложенный класс. Снижко это почему-то не нравится, хотя Петухов мне сказал что я умничка. Гущин тоже ничего против не имел)) Он мне тоже сказал "хорошо")))))
{
public:
Statue* statue;
Element *next;
};
Element *Head; //указатель на головной элемент списка. Изначально неопределен.
Element *Last;//указатель на последний элемент
public:
List();//конструктор
void GetLast();//в переменную Last записываем указатель на последний эл-т
void Add(Statue* statue); //добавление элемента в конец списка
bool Del(int index);//удаление статуи из списка
bool Del_Last(); //удаление последнего элемента списка
void Print();//вывод всего списка на экран
};
//Далее идут функции класса "Список"
List::List()
{
Head=NULL;
Last=NULL;
}
void List::GetLast()
{
Element* pCurr=Head;
while(pCurr->next!=NULL)
{
pCurr=pCurr->next;
}
Last=pCurr;
}
void List::Add(Statue* statue)
{
Element* temp = new Element(); //создание нового элемента
temp->statue = statue;
temp->next = NULL;
if (Head==NULL)
Head = temp;//верно только для добавления первого эл-та
else
Last->next = temp;
Last = temp;
}
bool List::Del(int index)
{
cout<<"\n\t >>>Вы хотите удалить элемент №"<<index<<" <<<"<<endl;
Element* pCurr = Head; //создаем указатель и настраиваем его на первый элемент списка
for (int i=1; i<index;i++) //ищем в списке элемент, который надо удалить
pCurr = pCurr->next;
Element* tmp = pCurr; //создаем указатель на этот элемент
int i=1;
pCurr = Head;
while(pCurr && i<index-1)
{
pCurr=pCurr->next;
i++;
}
tmp = pCurr->next;
pCurr->next = tmp->next;
delete tmp;
return true;
}
bool List::Del_Last()
{
Element* pCurr = Head; //указателю на текущий элемент присваиваем адрес первого элемента списка
if (pCurr->next==NULL){ //если у этого указателя указатель нэкст равен 0, то удаляем его (то есть проверяем, ни один ли элемент находится в списке)
delete pCurr;
Head=NULL;
}
else
while (pCurr->next->next) //хотим остановиться на предпоследнем элементе
pCurr=pCurr->next;
Element* tmp; //создаем еще один временный указатель
tmp=pCurr->next;
pCurr->next=NULL;
delete tmp;
return true;
}
void List::Print() //прямой просмотр списка
{
cout<<"--------------------------------------"<<endl;
cout<<"\n\t >>> ВЫВОД СПИСКА <<<"<<endl;
Element* temp = Head; // запоминаем адрес головного элемента
while(temp != 0) // Пока еще есть элементы
{
cout <<"\n\t\tВывод элемента списка:\n\n";
cout <<"Название статуи:\t"<< temp->statue->Author<< " "<<endl; // Выводим данные
cout <<"Местоположение:\t"<< temp->statue->Mesto<< " "<<endl;
cout <<"Дата установки:\t"<< temp->statue->Date<< " "<<endl;
cout <<"Что изображено:\t"<< temp->statue->Izobr<< " "<<endl;
temp = temp->next; // Переходим на следующий элемент
}
cout<<"--------------------------------------"<<endl;
}
//Далее идет объявление класса "Тест", он для того, чтобы не писать огромную функцию мэйн
class Test
{
private:
static int num; //переменная для выбора опции меню. Она статическая, след. тут только её объявление
public:
static bool Out_Menu(); //метод вызова меню
static bool My_List(); //метод, в котором мы работаем со списком.
};
int Test::num;//переменная класса Тест, вернее её инициализация. Переменная для осуществления выбора пункта меню
Statue* CreateStatue() //Некая глобальная функция, с помощью которой создается новый экземпляр класса "Статуя", объявлена ВНЕ ВСЕХ КЛАССОВ!!!
{
Statue* statue = new Statue();
cout<<"\n\t\t >>>>ВВОД НОВОГО ЭЛЕМЕНТА СПИСКА\n\n";
cout<<"Автор:\t";
cin>>statue->Author;
cout<<"Местоположение статуи:\t ";
cin>>statue->Mesto;
cout<<"Дата установки:\t";
cin>>statue->Date;
cout<<"Что изображено:\t";
cin>>statue->Izobr;
return statue;
}
bool Test::Out_Menu() //сам метод вывода меню на экран
{
cout<<"\n\n\n\t\tВыберите действие:\n";
cout<<"\n\t 1. Добавление элемента в список";
cout<<"\n\t 2. Удаление элемента из списка";
cout<<"\n\t 3. Удаление последнего элемента списка";
cout<<"\n\t 4. Вывод списка на экран";
cout<<"\n\t 5. Выход";
cout<<"\n\n\n\t Сделайте выбор:";
cin>>num;
return true;
}
bool Test::My_List() //метод, в котором и происходит вся работа со списком.
{
List myList;
do
{
Out_Menu();
switch (num){
case 1: {
Statue* statue = CreateStatue();
myList.Add(statue);
break;
}
case 2: {
int index;
cout<<"Введите номер элемента для удаления:";
cin>>index;
myList.Del(index);
break;
}
case 3:{
myList.Del_Last();
break;
}
case 4: {
myList.Print();
break;
}
case 5: exit(1); //если хочешь пиши вместо экзита брик. Смысл тот же. Выход из цикла.
default: cout<<"\n Неверный ввод!";cin.get();
}
}
while (1);
return true;
}
int main (void)
{
Test test; //создаём экземпляр класса "Тест", хотя этого можно и не делать, т.к. члены этого класса статические
test.My_List(); //просто вызываем метод класса "Тест"
return 0;
}