Скачиваний:
52
Добавлен:
17.03.2015
Размер:
40.96 Кб
Скачать

#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");

}