Определение класса параметризированного списка из типов

Страницы работы

3 страницы (Word-файл)

Содержание работы

ВАРИАНТ №21

Задание:

Используя производные классы, определить класс параметризованного списка одного из следующих типов. Применить его для построения списка объектов указанного типа данных.

Определим следующие классы списков:

S5. Очередь.

Определим следующие типы данных:

T1. Число по модулю n.

Текст программы:

#include <conio.h>

#include <iostream.h>

#include <stdlib.h>

#include <alloc.h>

#include <math.h>

#include <stdio.h>

#define N 3   //число, из остатков от деления на которое будут состоять все числа класса

template <class DataT> class ModN;

template <class DataT> class ModN //класс числа по модулю N с указателем на следующий

//элемент (т.к. список – очередь)

{       

public:

DataT info;

ModN<DataT> *next; //указатель на следующий элемент класса 

ModN() //конструктор

{info=0; next=NULL;}

ModN(DataT c) //конструктор

{info=(DataT)abs(c)%N; next=NULL;}

// Перегрузка оператора <=

int operator<=(ModN g)

{

if (info<= g.info) return 1; else return 0;

}

// Перегрузка оператора <

int operator<(ModN g)

{

if (info < g.info) return 1; else return 0;

}

// Перегрузка оператора ==

int operator==(ModN g)

{

if (info == g.info) return 1; else return 0;

}

};

template <class DataT>

class queue: public ModN<DataT> //производный класс очередь

{

ModN<DataT> *start; //указатель на начало

public:

queue(){start=NULL;} //конструктор

~queue();           //деструктор

void append(DataT c); //добавление в конец очереди

DataT take_out(void) //удаление с начала очереди

{

ModN<DataT> *old_item;

old_item=start;  //сохраняем предыдущую структуру элементов

DataT old_info = 0 ;

if ( start ) //если очередь не пуста

{

old_info = old_item -> info; //запоминаем элемент

start = ( start ) -> next; //переходим к следующему элементу

free (old_item ); //освобождаем текущий элемент

}

return ( old_info );   //возвращаем последний элемент   

}

void show();  //функция, для показа всех элементов очереди

int isempty()  //функция проверки очереди на пустоту

{

if(start) return 0; //если есть элементы (указатель на начало не указывает на

//NULL, то возвращаем 0 – очередь не пуста

else return 1;    //в противном случае возвращаем 1

}

DataT peek(){return start->info;} // чтение первого элемента очереди

};

template <class DataT> queue<DataT>::~queue()  //деструктор (удаление всех элементов)

{

ModN<DataT> *p, *p1;

p=start;

while(p)

{

p1=p->next; delete p; p=p1;

}

}

// добавление в конец очереди

template <class DataT> void queue<DataT>::append(DataT c)

{

ModN<DataT> *p,*cur;

p= new ModN<DataT>; //создаем новый элемент класса чисел по модулю N типа DataT

if(!p){cout<<"Память не может быть выделена!!\n";exit(1);}

p->info=abs(c)%N;  //заполняем его поля переданным значением

p->next=NULL; //устанавливаем указатель

if(start==NULL) //если очередь была пуста

start=p; //поменять указатель на созданный и заполненный элемент класса

} else //если очередь не пуста

{

cur=start;   //сохраняем указатель на текущий элемент

while (cur->next)  //перемещаемся до последнего элемента

{

cur=cur->next;

}

cur->next=p; // делаем вновь созданный элемент самым последним

}

}

template <class DataT>

void  queue<DataT>::show()  //показ всей очереди

{

ModN<DataT> *temp;

temp= start;

while(temp)  //до тех пор, пока не будут пройдены все элементы

{

cout<< temp->info<< "\n";  //выводить поле со значениями

temp = temp ->next;

}

cout<< endl;

}

void main (void)

{

int num,n,err;

char st[20];

queue<int> qu;

ModN<int> mod;

// Интерфейс работы

do

{

clrscr();

printf("Элементы данной очереди (mod N, N=%d): \n",N);

if(qu.isempty()) printf("Queue is empty\n");

qu.show();  //отображение содержимого очереди

cout << "\n\nВыберите действие\n\

<1> Добавить элемент в конец очереди\n\

<2> Извлечь элемент из начала очереди\n\

<3> Прочитать первый элемент очереди\n\

<4> Закончить\n\n";

num = getch();

switch (num)

{

case '1':

cout << "Введите значение элемента \n";

scanf("%s",st);  //если пользователь ввел не цифры, а просто символы

n=atoi(st);  //преобразовываем строку символов в целое число

qu.append(n); //добавляем в конец очереди

break;

case '2':

if(!qu.isempty()) {

printf( "Извлечен первый элемент из очереди: %d \n", qu.take_out()); getch();}

else cout<<"Очередь пуста\n"; getch();

break;

case '3':

if(!qu.isempty()) {

printf("Прочитан первый элемент из очереди: %d\n", qu.peek()); getch();}

else cout<<"Очередь пуста\n"; getch();

break;

}

} while (num != '4');

getch();

}

Результат работы программы:

Похожие материалы

Информация о работе