C++
25 Apr 2010
 
 
 
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
#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;
}