Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <stdio.h>
- #include <string.h>
- #include <conio.h>
- #include <clocale>
- #include <iostream>
- #include <fstream>
- #include <Windows.h>
- using namespace std;
- template<typename T>
- class List {
- public:
- List();
- ~List();
- void PopFront();
- void PopFrontAll();
- void PushFront(T data);
- void PushMiddle(T data);
- void PushBack(T data);
- void Insert(T data, int index);
- void RemoveAt(int index);
- void FindIndexElement(List<T> &lst);
- void FindValueElement(List<T> &lst);
- void ShowListValue(List<T> &lst);
- void ShowListAdress(List<T> &lst);
- void Average(List<T> &lst);
- void Menu(List<T> &lst);
- int GetSize() { return size; }
- T& operator[](const int index);
- private:
- template<typename T>
- class Node
- {
- public:
- Node * pNext;
- T data;
- Node(T data = T(), Node *pNext = nullptr)
- {
- this->data = data;
- this->pNext = pNext;
- }
- };
- int size;
- Node<T> *head;
- };
- template<typename T>
- List<T>::List()
- {
- size = 0;
- head = nullptr;
- }
- template<typename T>
- List<T>::~List()
- {
- PopFrontAll();
- }
- template<typename T>
- void List<T>::PopFront()
- {
- Node<T> *temp = head;
- head = head->pNext;
- delete temp;
- size--;
- }
- template<typename T>
- void List<T>::PopFrontAll()
- {
- while (size)
- {
- PopFront();
- }
- }
- template<typename T>
- void List<T>::PushFront(T data)
- {
- head = new Node<T>(data, head);
- size++;
- }
- template<typename T>
- void List<T>::PushMiddle(T data)
- {
- Insert(data, ceil(double(GetSize() / 2.0)));
- }
- template<typename T>
- void List<T>::PushBack(T data)
- {
- if (head == nullptr)
- {
- head = new Node<T>(data);
- }
- else
- {
- Node<T> *current = this->head;
- while (current->pNext != nullptr)
- {
- current = current->pNext;
- }
- current->pNext = new Node<T>(data);
- }
- size++;
- }
- template<typename T>
- void List<T>::Insert(T data, int index)
- {
- if (index == 0)
- {
- PushFront(data);
- }
- else
- {
- Node<T> *previous = this->head;
- for (int i = 0; i < index - 1; i++)
- {
- previous = previous->pNext;
- }
- previous->pNext = new Node<T>(data, previous->pNext);
- size++;
- }
- }
- template<typename T>
- void List<T>::RemoveAt(int index)
- {
- if (index == 0)
- {
- PopFront();
- }
- else
- {
- Node<T> *previous = this->head;
- for (int i = 0; i < index - 1; i++)
- {
- previous = previous->pNext;
- }
- Node<T> *toDelete = previous->pNext;
- previous->pNext = toDelete->pNext;
- delete toDelete;
- size--;
- }
- }
- template<typename T>
- void List<T>::FindIndexElement(List<T> &lst)
- {
- int indexLst;
- cin >> indexLst;
- for (int i = 0; i < lst.GetSize(); i++)
- {
- if (i == indexLst)
- {
- cout << lst[i] << endl;
- }
- }
- }
- template<typename T>
- void List<T>::FindValueElement(List<T> &lst)
- {
- int valueLst;
- cin >> valueLst;
- for (int i = 0; i < lst.GetSize(); i++)
- {
- if (lst[i] == valueLst)
- {
- cout << i << endl;
- }
- }
- }
- template<typename T>
- void List<T>::ShowListValue(List<T> &lst)
- {
- for (int i = 0; i < lst.GetSize(); i++)
- {
- cout << lst[i] << " ";
- }
- cout << endl << "Всего элементов: " << size;
- cout << endl;
- }
- template<typename T>
- void List<T>::ShowListAdress(List<T> &lst)
- {
- for (int i = 0; i < lst.GetSize(); i++)
- {
- cout << &lst[i] << endl;
- }
- cout << endl << "Всего элементов: " << size;
- cout << endl;
- }
- template<typename T>
- void List<T>::Average(List<T> &lst)
- {
- double sum = 0;
- for (int i = 0; i < lst.GetSize(); i++)
- {
- sum += lst[i];
- }
- sum /= lst.GetSize();
- cout << sum;
- cout << endl;
- }
- template<typename T>
- T & List<T>::operator[](const int index)
- {
- int counter = 0;
- Node<T> *current = this->head;
- while (current != nullptr)
- {
- if (counter == index)
- {
- return current->data;
- }
- current = current->pNext;
- counter++;
- }
- }
- void Input()
- {
- List<int> lst;
- int sizeOfLst;
- cout << "Введите количество элементов списка: ";
- cin >> sizeOfLst;
- int valueOfLst;
- cout << "Заполните список: ";
- for (int i = 0; i < sizeOfLst; i++)
- {
- cin >> valueOfLst;
- lst.PushBack(valueOfLst);
- }
- lst.Menu(lst);
- }
- void File()
- {
- List<int> lst;
- ifstream fin("E:\\numbers.txt");
- int numbers;
- if (fin.is_open())
- {
- while (fin >> numbers)
- {
- lst.PushBack(numbers);
- }
- }
- fin.close();
- }
- void SubMenu()
- {
- cout << "Выберите программу: \n1:Список (заполняется с клавиатуры)\n2:Список (заполняется из файла)\n3:Графы\n";
- char choice = _getch();
- switch (choice)
- {
- case '1':
- {
- Input();
- }
- case '2':
- {
- File();
- }
- case '3':
- {
- }
- default:
- {
- }
- }
- }
- template<typename T>
- void List<T>::Menu(List<T> &lst)
- {
- char choice = _getch();
- while (choice != 'x')
- {
- cout << "Выберите функцию: \n1.Добавить элемент (в начало)\n2.Добавить элемент (в середину)\n3.Удалить элемент\n4.Поиск элемена (по индексу)\n5.Поиск элемента (по значению)\n6.Вывести список\n";
- switch (choice)
- {
- case '1':
- {
- int number;
- cout << "Введите число: ";
- cin >> number;
- lst.PushFront(number);
- break;
- }
- case '2':
- {
- int number;
- cout << "Введите число: ";
- cin >> number;
- lst.PushMiddle(number);
- break;
- }
- case '3':
- {
- int index;
- cout << "Укажите индекс элемент";
- cin >> index;
- lst.RemoveAt(index);
- break;
- }
- case '4':
- {
- lst.FindIndexElement(lst);
- break;
- }
- default:
- break;
- }
- }
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- SubMenu();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement