#include<string.h>
#include <iostream>
using namespace std;
class Element
{
// информационное поле списка
char info;
//// указатель на следующий элемент списка
Element * next;
public:
// конструктор элемента списка
Element(char,char,int ,int , Element* = NULL);
// метод получения информационного поля
// элемента списка
int GetValue();
// метод установки нового значения
// информационного поля
void SetValue(char);
// метод получения указателя
// на следующий элемент списка
Element* GetPointer();
// метод установки нового значения
// адреса следующего элемента
void SetPointer(Element*);
};
class Student
{
class Element
{
char Name [50];
char Surname [60];
int NumOfTkt;
int Year;
public:
// информационное поле списка
char info;
//// указатель на следующий элемент списка
Element * next;
public:
// конструктор элемента списка
Element(char,char,int ,int, Element* =NULL);
// метод получения информационного
// поля элемента списка
int GetValue();
// метод установки нового значения
// информационного поля
void SetValue(char);
// метод получения указателя
// на следующий элемент списка
Element* GetPointer();
// метод установки нового значения
// адреса следующего элемента
void SetPointer(Element*);
};
protected:
// заголовок списка
Element* head;
public:
// конструктор создания пустого списка
Student();
// конструктор копирования
Student(const Student&);
// деструктор
~Student();
// метод проверки пустоты списка
bool IsEmpty();
// метод добавления элемента в заданную позицию
void AddStudent(char, char, int, int, int);
// метод удаления элемента из списка по ключу
void DeleteByKey(char, char,int,int );
// метод удаления элемента,
// находящегося в заданной позиции
int DeleteByPosition(int);
// дружественная функция печати списка
friend ostream& operator<<(ostream&, Student&);
};
// базовый класс иерархии исключений при работе со списком
class StudentException
{
public:
virtual void ShowMessage() = 0;
};
// класс-исключение при попытке обращения
// в некорректную позицию
class IncorrectPositionException : public StudentException
{
public:
void ShowMessage()
{
cout << "Некорректная позиция элемента в списке" << endl;
}
};
// класс-исключение при попытке извлечения
// элемента из пустого списка
class StudentIsEmptyException :
public
StudentException
{
public:
void ShowMessage()
{
cout << "Список пуст" << endl;
}
};
// конструктор элемента списка
Student::Element::Element(char x, Element* p)
{
info = x;
next = p;
}
// метод получения информационного поля элемента списка
int Student::Element::GetValue()
{
return info;
}
// метод установки нового значения информационного поля
void Student::Element::SetValue(char x)
{
info = x;
}
// метод получения указателя на следующий элемент списка
Student::Element* Student::Element::GetPointer()
{
return next;
}
// метод установки нового значения
// адреса следующего элемента
void Student::Element::SetPointer(Element* p)
{
next = p;
}
// конструктор по умолчанию для создания пустого списка
Student::Student()
{
head = NULL;
}
// конструктор копирования
Student::Student(const Student& Student1)
{
head = NULL;
Element* cur = Student1.head;
int n = 1;
// просмотр всех элементов списка Student1 и добавление
// в новый список элементов с теми же
// значениями информационного поля
while(cur != NULL)
{
AddStudent(cur -> GetValue(),cur -> GetValue(),cur -> GetValue(),cur -> GetValue(), n++);
cur = cur -> GetPointer();
}
}
// деструктор – удаление всех элементов списка
Student::~Student()
{
Element * cur, *help;
cur = head;
while(cur != NULL)
{
help = cur -> GetPointer();
delete cur;
cur = help;
}
}
// метод проверки пустоты списка
bool Student::IsEmpty()
{
if(head == NULL)
return true;
return false;
}
// метод добавления элемента в заданную позицию
void Student::AddStudent(char Name ,
char Surname,
int NumOfTkt,
int Year, int pos)
{
Element* current,*help;
// добавление в начало списка (приводит к изменению
// адреса первого элемента списка)
if(pos == 1)
{
help = new Element( Name ,Surname,NumOfTkt,Year, head);
head = help;
return;
}
// поиск элемента, после которого
// требуется вставить новый
current = head;
int i = 1;
while(i != pos - 1 && current != NULL)
{
i++;
current = current -> GetPointer();
}
// генерация исключения для случая
// некорректной позиции вставки
if(current == NULL)
throw IncorrectPositionException();
// создание нового элемента и включение его в список
help = new Element( Name , Surname,NumOfTkt, Year, current -> GetPointer());
current -> SetPointer(help);
}
// метод удаления элементов списка по ключу
void Student::DeleteByKey(char Name,char Surname,int NumOfTkt,int Year)
{
Element* current, *help;
// удаление элементов с заданным ключом
// из начала списка
while(head != NULL && head -> GetValue() == Name)
{
help = head;
head = head -> GetPointer();
delete help;
}
if(head != NULL)
{
// удаление элементов с заданным ключом из
// середины и/или с конца списка
current = head;
while(current->GetPointer() != NULL)
{
help = current->GetPointer();
if(help->GetValue() == Name)
{
current -> SetPointer
(help->GetPointer());
delete help;
}
else
current = current->GetPointer();
}
}
}
// метод удаления элемента списка с заданной позиции
int Student::DeleteByPosition(int pos)
{
Element* current, *help;
// генерация исключения в случае попытки
// удаления из пустого списка
if(IsEmpty())
throw StudentIsEmptyException ();
int key;
// удаление из начала списка (приводит к изменению адреса первого элемента списка)
if(pos == 1)
{
help = head;
head = head -> GetPointer();
key = help -> GetValue();
delete help;
return key;
}
// поиск элемента, после которого
// требуется удалить элемент
current = head;
int i = 1;
while(i != pos - 1 && current->GetPointer() != NULL)
{
i++;
current = current -> GetPointer();
}
// генерация исключения для случая
// некорректной позиции удаления
if(current->GetPointer() == NULL)
throw IncorrectPositionException();
// удаление элемента из списка
help = current->GetPointer();
current -> SetPointer(help->GetPointer());
key = help->GetValue();
delete help;
return key;
}
// дружественная функция печати списка
ostream& operator << (ostream& out, Student& Student)
{
if(Student.IsEmpty())
out << "Список пустой" << endl;
else
{
Student::Element* current = Student.head;
while(current != NULL)
{
out << current -> GetValue() << " ";
current = current -> GetPointer();
}
}
out << endl;
return out;
}
void main()
{
Student Student;
while (true)
{
cout<<"\n\t\t\t Menu\n\n1->1Add \n2->2udalenie po klu4y\n3->3udalenie po pos\n4->4Print\n5->Exit \n\"";
int choice;
char q;
cin>>choice;
cout<<"\n";
switch(choice)
{
case 1:
{int Year, NumOfTkt, pos;
char Name , Surname;
cout<<"\nName\n";
cin>>Name;
cout<<"\name\n";
cin>>Surname;
cout<<"\nYear\n";
cin>>Year;
cout<<"\nNumOfTkt\n";
cin>>NumOfTkt;
cout<<"\nVv. nomer posicii na kot. dobavim\n";
cin>>pos;
Student.AddStudent(Name ,Surname,NumOfTkt,Year, pos);
}
break;
case 2:
{char* key;
char Name;
char Surname;
int NumOfTkt;
int Year;
cout<<"\nChto udalim key?\n";
cin>>key;
// метод удаления элемента из списка по ключу
Student.DeleteByKey(Name ,Surname,NumOfTkt,Year);
}
break;
case 3:
{int key, pos;
cout<<"\nChto udalim pos?\n";
cin>>pos;
// метод удаления элемента, находящегося в заданной позиции
Student.DeleteByPosition(pos);
}
break;
case 4:
{cout<<Student;
}
break;
case 5:
{
return;
}
default:
{
cout<<"\nError!\n";
}
}
}
}
класс студент ошибка.
ошибка в конструкторе элемента списка. как можно передать туда значение всего, что необходимо
модератор.