двунаправленный кольцевой список

Описать класс для реализации работы с выбранной динамической структурой данных, которая хранит список студентов группы. Класс должен содержать следующие, доступные пользователю интерфейсы:

добавление элемента после последнего;

добавление элемента перед первым;

добавление элемента по порядку (предполагается, что элемент в динамической структуре отсортированы, и необходимо, чтобы добавление нового элемента не нарушило упорядоченности);

удаление элемента с указанной информационной частью; поиск элемента;

удаление всех элементов.

сортировка элементов;

упорядочение текущего элемента (предполагается, что все остальные элементы упорядочены);

перегруженный оператор !, определяющий существование элементов в структуре данных;

копирование структуры данных с помощью перегруженного оператора присваивания;

При разработке класса для работы со списками также должны быть реализованы следующие поля и методы:

поле (недоступное пользователю), хранящее указатель на текущий элемент; получение ссылки на информационную часть текущего элемента (возвращает удачность операции);

получение копии информационной части текущего элемента (возвращает удачность операции);

перегруженный оператор ++ (префиксный) для перехода к следующему элементу;

перегруженный оператор -- (префиксный) для перехода к предыдущему элементу (для двунаправленного списка);

метод, переводящий указатель на текущий элемент в начало (конец, при необходимости) списка.

Кроме перечисленных выше полей и методов может быть реализован итератор для работы со списком (с аналогичной функциональностью). При этом итератор должен быть шаблонным классом, дружественным разрабатываемому.

В качестве алгоритма сортировки при работе со списками использовать сортировки, не требующие доступа к произвольному элементу списка (например эффективные разновидности алгоритма вставки и т.п.), а при работе с массивом − быструю сортировку (сортировку Хоара).

При разработке класса в его методах НЕ ДОЛЖНЫ использоваться функции ввода/вывода для работы с консолью.

Помогите реализовать оставшиеся методы выделил их жирным

#include<cstdio>
#include<cstdlib>
using namespace std;

//структура узла

struct node
{
    int info;
    struct node* next;
    struct node* prev;
}*start, * last;
int counter = 0;
//объявление класса
class double_clist
{
public:
    node* create_node(int);
    void push_front(int value);
    void push_back(int value);
    void pop_front();
    void pop_back();
    void insert_pos(int value, int pos);
    void delete_pos(int pos);
    void search(int value);
    void update(int value, int pos);
    void display();
    void reverse();
    void sort();
    void clear();
    double_clist()
    {
        start = NULL;
        last = NULL;
    }
};

//главная функция
int main()
{
    double_clist cdl;
 
    cdl.push_back(4);
    cdl.push_back(4);


    return 0;
}

//создание узла
node* double_clist::create_node(int value)
{
    counter++;
    struct node* temp;
    temp = new(struct node);
    temp->info = value;
    temp->next = NULL;
    temp->prev = NULL;
    return temp;
}
//добавление элемента в начало
void double_clist::push_front(int value)
{
    struct node* temp;
    temp = create_node(value);
    if (start == last && start == NULL)
    {
        start = last = temp;
        start->next = last->next = NULL;
        start->prev = last->prev = NULL;
    }
    else
    {
        temp->next = start;
        start->prev = temp;
        start = temp;
        start->prev = last;
        last->next = start;
    }
}

//добавление элемента в конец
void double_clist::push_back(int value)
{

    struct node* temp;
    temp = create_node(value);
    if (start == last && start == NULL)
    {
        start = last = temp;
        start->next = last->next = NULL;
        start->prev = last->prev = NULL;
    }
    else
    {
        last->next = temp;
        temp->prev = last;
        last = temp;
        start->prev = last;
        last->next = start;
    }
}
//удаление элемента с начала
void double_clist::pop_front()
{
    node* ptr = nullptr, * s;
    if (start == last && start == NULL)
    {
        return;
    }
    s = start;
    counter--;
    last->next = s->next;
    s->next->prev = last;
    start = s->next;
    free(s);
    return;
}
//удаление элемента с конца
void double_clist::pop_back()
{
    node* ptr = nullptr, * s;
    if (start == last && start == NULL)
    {
        return;
    }
    s = start;
    for (int i = 0; i < counter - 1; i++)
    {
        s = s->next;
        ptr = s->prev;
    }
    ptr->next = s->next;
    s->next->prev = ptr; 
    last = ptr;
    counter--;
    free(s);
}
//добавление элемента по индексу
void double_clist::insert_pos(int value, int pos)
{
    struct node* temp, * s, * ptr;
    temp = create_node(value);
    if (start == last && start == NULL)
    {
        if (pos == 1)
        {
            start = last = temp;
            start->next = last->next = NULL;
            start->prev = last->prev = NULL;
        }
        else
        {
            counter--;
            return;
        }
    }
    else
    {
        if (counter < pos)
        {
            counter--;
            return;
        }
        s = start;
        for (int i = 1; i <= counter; i++)
        {
            ptr = s;
            s = s->next;
            if (i == pos - 1)
            {
                ptr->next = temp;
                temp->prev = ptr;
                temp->next = s;
                s->prev = temp;
                break;
            }
        }
    }
}
//удаление элемента из указанной позиции
void double_clist::delete_pos(int pos)
{
    node* ptr=nullptr, * s;
    if (start == last && start == NULL)
    {
        return;
    }
    if (counter < pos)
    {
        return;
    }
    s = start;
    if (pos == 1)
    {
        counter--;
        last->next = s->next;
        s->next->prev = last;
        start = s->next;
        free(s);
        return;
    }
    for (int i = 0; i < pos - 1; i++)
    {
        s = s->next;
        ptr = s->prev;
    }
    ptr->next = s->next;
    s->next->prev = ptr;
    if (pos == counter)
    {
        last = ptr;
    }
    counter--;
    free(s);
}
//обновление данных в указанном узле
void double_clist::update(int value, int pos)
{
    if (start == last && start == NULL)
    {
        return;
    }
    struct node* s;
    if (counter < pos)
    {
        return;
    }
    s = start;
    if (pos == 1)
    {
        s->info = value;
        return;
    }
    for (int i = 0; i < pos - 1; i++)
    {
        s = s->next;
    }
    s->info = value;
}
//поиск элемента в списке
void double_clist::search(int value)
{
    int pos = 0;
    bool flag = false;
    struct node* s;
    if (start == last && start == NULL)
    {
        return;
    }
    s = start;
    for (int i = 0; i < counter; i++)
    {
        pos++;
        if (s->info == value)
        {
            flag = true;
        }
        s = s->next;
    }
}
//сортировка списка
void double_clist::sort()
{
    struct node* temp, * s;
    int value, i;
    if (start == last && start == NULL)
    {
        return;
    }
    s = start;
    for (i = 0; i < counter; i++)
    {
        temp = s->next;
        while (temp != start)
        {
            if (s->info > temp->info)
            {
                value = s->info;
                s->info = temp->info;
                temp->info = value;
            }
            temp = temp->next;
        }
        s = s->next;
    }
}
//очистка всего списка
void double_clist::clear()
{
    if (start == last && start == NULL)
    {
        return;
    }
    while (counter > 0)
    {
        pop_back();
    }
}
//вывод на экран
void double_clist::display()
{
    int i;
    struct node* s;
    if (start == last && start == NULL)
    {
        return;
    }
    s = start;
    for (i = 0; i < counter - 1; i++)
    {
        cout << s->info << "<->";
        s = s->next;
    }
    cout << s->info << endl;
}
//перевернуть список наоборот
void double_clist::reverse()
{
    if (start == last && start == NULL)
    {
        return;
    }
    struct node* p1, * p2;
    p1 = start;
    p2 = p1->next;
    p1->next = NULL;
    p1->prev = p2;
    while (p2 != start)
    {
        p2->prev = p2->next;
        p2->next = p1;
        p1 = p2;
        p2 = p2->prev;
    }
    last = start;
    start = p1;
}```

Ответы (0 шт):