
5-Алгоритмизация и программировани / Алгоритмиз и прогр БИСЗУ11 / Лабораторные работы / Лабораторная работа3 Списки / Пример шаблона односвязного списка
.doc#include "stdafx.h"
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;
//Шаблон класса "Узел односвязного списка"
template<class Data>
class Node{
Data value; //Данные, хранимые в узле
Node* next; //Адрес следующего узла
public:
Node(Data v): value(v){} //Конструктор
Data Value(){return value;} //Доступ к данным
Node*& Next(){return next;} //Доступ к адресу следующего узла
};
//Шаблон класса "Односвязный список"
template<class Type>
class List1
{
Node<Type> *begin; //Адрес первого узла списка
Node<Type> *end; //Адрес последнего узла списка
int size; //Количество узлов в списке
public:
List1(): begin(0),end(0),size(0){} //Конструктор
~List1(); //Деструктор
void Insert_begin(Type); //Добавление элемента в начало списка
void Insert_end(Type); //Добавление элемента в конец списка
void Delete_begin(); //Удаление элемента из начала списка
void Display(ostream& os=cout); //Вывод списка (по умолчанию - на экран)
void Clear_list(); //Удаление всех элементов из списка
void Search(Type); //Поиск заданного значения в списке
};
//Внешнее определение шаблонов методов шаблона класса List1
//Добавление элемента в начало списка
template<class Type>
void List1<Type>::Insert_begin(Type v)
{ Node<Type> *p=new Node<Type>(v);
if(!begin)
{
begin=end=p;
p->Next()=0;
}
else
{p->Next()=begin;
begin=p;
}
size++;
}
//Добавление элемента в конец списка
template<class Type>
void List1<Type>::Insert_end(Type v)
{
Node<Type> *p=new Node<Type>(v);
if(!begin)
{
begin=end=p;
}
else
{end->Next()=p;
end=p;
}
p->Next()=0;
size++;
}
//Удаление элемента из начала списка
template<class Type>
void List1<Type>::Delete_begin()
{Node<Type>* p;
if(begin)
{
p=begin;
begin=p->Next();
size--;
delete p;
}
}
//Вывод списка (по умолчанию - на экран)
template<class Type>
void List1<Type>::Display(ostream& os=cout)
{
Node<Type> *p;
p=begin;
if (p==0) cout<<"\n\n\tSpisok pust";
while(p)
{
os<<p->Value()<<" ";
p=p->Next();
}
cout<<"\n";
}
//Удаление всех элементов из списка
template<class Type>
void List1<Type>::Clear_list()
{Node<Type> *p,*p1;
if(begin)
{p=begin;
while(p)
{p1=p->Next();
delete p;
p=p1;
}
begin=end=0;
size=0;
}
}
//Деструктор
template<class Type>
List1<Type>::~List1(){this->Clear_list();}
//Поиск заданного значения в списке
template<class Type>
void List1<Type>::Search (Type S)
{ int kol=0;
Node<Type> *p=begin;
while(p)
{if(p->Value()==S)
kol++;
p=p->Next();
}
if (kol==0)
cout<<"Net takih elementov\n"<<endl;
else cout<<"Naydeno "<<kol<<" elementov\n"<<endl;
}
//_______________________________________________________
void main()
{int S;
List1<int> L;
int number; //Punkt menu
while(1)
{ system("cls");
cout<<"\n\t\t\t1. Dobavlenie zapisi v nachalo spiska";
cout<<"\n\t\t\t2. Dobavlenie zapisi v konec spiska";
cout<<"\n\t\t\t3. Udalenie zapisi iz nachala spiska";
cout<<"\n\t\t\t4. Vyvod spiska na ekran";
cout<<"\n\t\t\t5. Ochistka spiska";
cout<<"\n\t\t\t6. Poisk po znacheniyu";
cout<<"\n\t\t\t7. Vyhod";
cout<<"\n\n\n\tVvedite nomer punkta menu: ";
cin>>number;
switch(number)
{
case 1: cout<<"VVedite element:";
cin>>S;
L.Insert_begin(S);
cout<<"\n\n\t\tZapis dobavlena v nachalo spiska\n";
system("pause");
break;
case 2: cout<<"VVedite element:";
cin>>S;
L.Insert_end(S);
cout<<"\n\n\t\tZapis dobavlena v konec spiska\n";
system("pause");
break;
case 3: L.Delete_begin();
cout<<"\n\n\t\tZapis udalena iz nachala spiska\n";
system("pause");
break;
case 4: cout<<"\n\n\t\tSpisok: ";
L.Display(); //Vyvod spiska na ekran
system("pause");
break;
case 5: L.Clear_list();
cout<<"\n\n\t\tIz spiska udaleny vse zapisi\n";
system("pause");
break;
case 6: cout<<"\n\n\t\tVvedite element dlya poiska";
cin>>S;
L.Search(S);
system("pause");
break;
case 7: exit(1);
default: break; } }
system("pause");
}