лаба 6 с комментариями

mail@pastecode.io avatar
unknown
c_cpp
2 years ago
3.3 kB
21
Indexable
Never
#include <iostream>


template <typename T>
struct Node
// узел или нода. Список это сеть узлов, по которому мы гуляем, когда работаем с ним
// Список это не один массив данных. Это именно порядок узлов, где они друг на друга ссылаются
{
	// Здесь хранится передаваемая переменная
	T data;
	// Указатель на следующий элемент
	Node *next;
};

template <typename T>
class List
{
private:
	// Указатель на первый элемент
	Node<T>* _head;
	// Размер лист
	int _size = 0;

public:
	List() {
		// _head - указатель на первый элемент
		// У нас список с односвязным связыванием.
		_head = nullptr;
	};

    void push(T val){
    	// добавить элемент в начало списка
        Node<T> *n = new Node<T>();
        n->data = val;             
        n->next = _head;        
        _head = n;              
	    _size++;
    }

    T pop(){
    	// удалить элемент в начале списка и вернуть элемент p
      if(_head) {
        T p = _head->data;
        _head = _head->next;
	    _size--;
        return p;
      }
    }

    void set_value(int idx, T value) 
    {
    	// Установка нового значения по индексу idx
    	// Используется перебор для поиска
			Node<T> *temp = _head;
	    int index = 0;
	    while (temp->next) {
	    	if (index == idx) {
	    		temp->data = value;
	    		return;
	    	} else {
	    		temp = temp->next;
	    	}
	    	index++;
	    }
	    temp->data = value;
    }

	T& operator [](int idx)
	{
			// Получение значения элемент по индексу idx
	    Node<T> *temp = _head;
	    int index = 0;
	    while (temp->next) {
	    	if (index == idx) {
	    		return temp -> data;
	    	} else {
	    		temp = temp->next;
	    	}
	    	index++;
	    }
	    return temp -> data;
	}

	void print_data() 
	{
		// вывод всего списка
		Node<T> *temp = _head;
		// пока у текущего элемента есть следующий
	    while (temp->next) {
	    	// выводим его на экран
	    	std::cout << temp->data << " ";		
	    	// текущий = следующий
	    	temp = temp->next;
	    }
	    std::cout << temp->data << " ";
	    std::cout << std::endl;
	}
};


int main() {
	//  Даны два списка L1  и L2. 
	// Сформировать список L3, элементы которого являются разностью соответствующих элементов L1  и L2.
	int n;
	std::cout << "Input n=";
	std::cin >> n;

	// Создаём списки 
	List<int> list1, list2;
	int temp;
	for (int i=0; i<n; i++) {
		std::cout << "Input list1[" << i << "]=";
		std::cin >> temp;
		list1.push(temp);
	};
	for (int i=0; i<n; i++) {
		std::cout << "Input list2[" << i << "]=";
		std::cin >> temp;
		list2.push(temp);
	}

	List<int> list3;
	for (int i=0; i<n; i++) {
		temp = list2[i] - list1[i];
		list3.push(temp);
	}
	std::cout << "list3:\n";
	list3.print_data();
	return 0;
};