Загрузка данных


#include "stdafx.h"
#include <iostream>

using namespace std;

template <typename ItemType>
class Base_List;

template <typename ItemType>
ostream& operator<<(ostream& os, const Base_List<ItemType>& list);

template <typename ItemType>
class Base_List {
protected:
    int list_size;

public:
    Base_List() {
        list_size = 0;
    }

    virtual ~Base_List() {}

    int size() const {
        return list_size;
    }

    bool empty() const {
        return list_size == 0;
    }

    virtual const ItemType& operator[](const int index) const = 0;

    virtual Base_List<ItemType>& add_elem(const ItemType& It) = 0;

    virtual Base_List<ItemType>& swap_nodes(const int& first, const int& second) = 0;

    virtual Base_List<ItemType>& remove_by_value(const ItemType& value) = 0;

    virtual Base_List<ItemType>& remove_by_index(const int& a) = 0;

    template <typename U>
    friend ostream& operator<<(ostream& os, const Base_List<U>& list);
};

template <typename ItemType>
ostream& operator<<(ostream& os, const Base_List<ItemType>& list) {
    for (int i = 0; i < list.list_size; i++) {
        os << list[i] << " ";
    }

    return os;
}

template <typename ItemType>
class Sorted_List : public Base_List<ItemType> {
private:
    struct Node {
        ItemType data;
        Node* next;
        Node* prev;

        Node(const ItemType& value) {
            data = value;
            next = NULL;
            prev = NULL;
        }
    };

    Node* head;
    Node* tail;

    Node* get_node(const int index) const {
        if (index < 0 || index >= this->list_size) {
            cout << "Index error!" << endl;
            return NULL;
        }

        Node* current = head;

        for (int i = 0; i < index; i++) {
            current = current->next;
        }

        return current;
    }

    void delete_node(Node* node) {
        if (node == NULL) {
            return;
        }

        if (node->prev != NULL) {
            node->prev->next = node->next;
        }
        else {
            head = node->next;
        }

        if (node->next != NULL) {
            node->next->prev = node->prev;
        }
        else {
            tail = node->prev;
        }

        delete node;
        this->list_size--;
    }

public:
    Sorted_List() {
        head = NULL;
        tail = NULL;
        this->list_size = 0;
    }

    ~Sorted_List() {
        while (head != NULL) {
            Node* temp = head;
            head = head->next;
            delete temp;
        }

        tail = NULL;
        this->list_size = 0;
    }

    const ItemType& operator[](const int index) const {
        Node* node = get_node(index);
        return node->data;
    }

    Base_List<ItemType>& add_elem(const ItemType& It) {
        Node* new_node = new Node(It);

        if (head == NULL) {
            head = new_node;
            tail = new_node;
        }
        else if (It >= head->data) {
            new_node->next = head;
            head->prev = new_node;
            head = new_node;
        }
        else if (It <= tail->data) {
            new_node->prev = tail;
            tail->next = new_node;
            tail = new_node;
        }
        else {
            Node* current = head;

            while (current != NULL && current->data > It) {
                current = current->next;
            }

            new_node->next = current;
            new_node->prev = current->prev;

            current->prev->next = new_node;
            current->prev = new_node;
        }

        this->list_size++;
        return *this;
    }

    Base_List<ItemType>& swap_nodes(const int& first, const int& second) {
        if (first == second) {
            return *this;
        }

        int a = first;
        int b = second;

        if (a > b) {
            int temp_index = a;
            a = b;
            b = temp_index;
        }

        Node* A = get_node(a);
        Node* B = get_node(b);

        if (A == NULL || B == NULL) {
            return *this;
        }

        if (A->next == B) {
            Node* beforeA = A->prev;
            Node* afterB = B->next;

            if (beforeA != NULL) {
                beforeA->next = B;
            }
            else {
                head = B;
            }

            if (afterB != NULL) {
                afterB->prev = A;
            }
            else {
                tail = A;
            }

            B->prev = beforeA;
            B->next = A;

            A->prev = B;
            A->next = afterB;
        }
        else {
            Node* beforeA = A->prev;
            Node* afterA = A->next;

            Node* beforeB = B->prev;
            Node* afterB = B->next;

            if (beforeA != NULL) {
                beforeA->next = B;
            }
            else {
                head = B;
            }

            if (afterA != NULL) {
                afterA->prev = B;
            }
            else {
                tail = B;
            }

            if (beforeB != NULL) {
                beforeB->next = A;
            }
            else {
                head = A;
            }

            if (afterB != NULL) {
                afterB->prev = A;
            }
            else {
                tail = A;
            }

            A->prev = beforeB;
            A->next = afterB;

            B->prev = beforeA;
            B->next = afterA;
        }

        return *this;
    }

    Base_List<ItemType>& remove_by_value(const ItemType& value) {
        Node* current = head;

        while (current != NULL) {
            if (current->data == value) {
                delete_node(current);
                return *this;
            }

            current = current->next;
        }

        return *this;
    }

    Base_List<ItemType>& remove_by_index(const int& a) {
        Node* node = get_node(a);

        if (node != NULL) {
            delete_node(node);
        }

        return *this;
    }
};

int main() {
    Sorted_List<int> list;

    list.add_elem(5);
    list.add_elem(10);
    list.add_elem(3);
    list.add_elem(7);
    list.add_elem(1);
    list.add_elem(15);

    cout << "Sorted list: " << list << endl;
    cout << "list[2] = " << list[2] << endl;

    list.remove_by_value(7);
    cout << "After remove value 7: " << list << endl;

    list.remove_by_index(1);
    cout << "After remove index 1: " << list << endl;

    list.swap_nodes(0, 2);
    cout << "After swap index 0 and 2: " << list << endl;

    Sorted_List<char> letters;

    letters.add_elem('b');
    letters.add_elem('z');
    letters.add_elem('a');
    letters.add_elem('k');

    cout << "Char list: " << letters << endl;

    return 0;
}