Переделать под классы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Был бы благодарен, если бы вы помогли переделать эту задачу под классы.

Элемент *q включить перед элементом *p и пересмотреть список сначала

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int value;
    Node *next;
} Node;
 
typedef struct List
{
    Node *head;
    Node *tail;
    int length;
} List;
 
void construct_list(List *lst)
{
    lst->head = NULL;
    lst->tail = NULL;
    lst->length = 0;
}
 
void destruct_list(List *lst)
{
    Node *i = lst->head;
    Node *del_elem;
 
    while (i != NULL)
    {
        del_elem = i;
        i = i->next;
 
        free(del_elem);
    }
 
    lst->head = NULL;
    lst->tail = NULL;
    lst->length = 0;
}
 
void add_elem(List *lst, int value)
{
    Node *new_elem;
 
    new_elem = (Node *)malloc(sizeof(Node));
    new_elem->value = value;
    new_elem->next = NULL;
 
    ++lst->length;
 
    if (lst->length == 1)
    {
        lst->head = new_elem;
        lst->tail = new_elem;
 
        return;
    }
 
    lst->tail->next = new_elem;
    lst->tail = new_elem;
}
 
void add_before_elem(List *lst, int value, int next_value)
{
    Node *i = lst->head;
    Node *new_elem;
 
    if (lst->length == 0)
    {
        add_elem(lst, value);
 
        return;
    }
 
    ++lst->length;
 
    new_elem = (Node *)malloc(sizeof(Node));
    new_elem->value = value;
 
    if (i->value == next_value)
    {
        new_elem->next = i;
        lst->head = new_elem;
 
        return;
    }
 
    while (i->next != NULL)
    {
        if (i->next->value == next_value)
            break;
 
        i = i->next;
    }
 
    new_elem->next = i->next;
    i->next = new_elem;
}
 
void print_list(List *lst)
{
    Node *i = lst->head;
 
    if (lst->length != 0)
    {
        printf("%d", i->value);
 
        i = i->next;
 
        while (i != NULL)
        {
            printf(" -> %d", i->value);
 
            i = i->next;
        }
 
        printf("\n");
    }
}
 
//-----------------------------------------------------------------------------
 
int main(void)
{
    List lst;
 
    construct_list(&lst);
 
    print_list(&lst);
    add_elem(&lst, 1);
    print_list(&lst);
    add_elem(&lst, 3);
    print_list(&lst);
    add_elem(&lst, 2);
    print_list(&lst);
 
    add_before_elem(&lst, 10, 3);
    print_list(&lst);
    add_before_elem(&lst, 11, 25);
    print_list(&lst);
    add_before_elem(&lst, 12, 11);
    print_list(&lst);
    add_before_elem(&lst, 13, 1);
    print_list(&lst);
 
    destruct_list(&lst);
 
    return 0;
}

Решение задачи: «Переделать под классы»

textual
Листинг программы
#include <iostream>
 
class List
{
    struct Node
    {
        int _value;
        Node *_next;
 
        Node(int value = 0):
        _value(value),
        _next(0)
        {
        }
    };
 
public:
    List():
    _head(0),
    _tail(0),
    _length(0)
    {
    }
 
    ~List()
    {
        Node *i = _head;
        Node *del_elem;
 
        while (i != 0)
        {
            del_elem = i;
            i = i->_next;
 
            delete del_elem;
        }
    }
 
    void add_elem(int value)
    {
        Node *new_elem = new Node (value);
        
        ++_length;
        
        if (_length == 1)
        {
            _head = new_elem;
            _tail = new_elem;
            
            return;
        }
        
        _tail->_next = new_elem;
        _tail = new_elem;
    }
 
    void add_before_elem(int value, int next_value)
    {
        Node *i = _head;
        Node *new_elem;
        
        if (_length == 0)
        {
            add_elem(value);
            
            return;
        }
        
        ++_length;
        
        new_elem = new Node (value);
        
        if (i->_value == next_value)
        {
            new_elem->_next = i;
            _head = new_elem;
            
            return;
        }
        
        while (i->_next != 0)
        {
            if (i->_next->_value == next_value)
                break;
            
            i = i->_next;
        }
        
        new_elem->_next = i->_next;
        i->_next = new_elem;
    }
    
    void print_list()
    {
        Node *i = _head;
        
        if (_length != 0)
        {
            std::cout << i->_value;
            
            i = i->_next;
            
            while (i != 0)
            {
                std::cout << " -> " << i->_value;
                
                i = i->_next;
            }
            
            std::cout << std::endl;
        }
    }
 
private:
    Node *_head;
    Node *_tail;
    size_t _length;
};
 
int main()
{
    List lst;
 
    lst.print_list();
    lst.add_elem(1);
    lst.print_list();
    lst.add_elem(3);
    lst.print_list();
    lst.add_elem(2);
    lst.print_list();
 
    lst.add_before_elem(10, 3);
    lst.print_list();
    lst.add_before_elem(11, 25);
    lst.print_list();
    lst.add_before_elem(12, 11);
    lst.print_list();
    lst.add_before_elem(13, 1);
    lst.print_list();
 
    return 0;
}

Объяснение кода листинга программы

  1. Объявление класса List, содержащего узел (Node) для хранения значений и указателей на следующий и предыдущий узлы.
  2. Создание конструкторов класса List, инициализирующих узлы _head, _tail и _length списка.
  3. Создание деструктора класса List, освобождающего память, выделенную под узлы списка.
  4. Объявление метода add_elem класса List, добавляющего новый узел со значением в список.
  5. Объявление метода add_before_elem класса List, добавляющего новый узел со значением перед указанным узлом со следующим значением в список.
  6. Объявление метода print_list класса List, выводящего значения всех узлов списка.
  7. В функции main создается экземпляр класса List (lst).
  8. Вызывается метод print_list для вывода начального состояния списка (пустого списка).
  9. Вызывается метод add_elem для добавления первого элемента в список.
  10. Вызывается метод print_list для вывода измененного состояния списка (список содержит один элемент).
  11. Вызывается метод add_elem для добавления второго элемента в список.
  12. Вызывается метод print_list для вывода измененного состояния списка (список содержит два элемента).
  13. Вызывается метод add_elem для добавления третьего элемента в список.
  14. Вызывается метод print_list для вывода измененного состояния списка (список содержит три элемента).
  15. Вызывается метод add_elem для добавления четвертого элемента в список.
  16. Вызывается метод print_list для вывода измененного состояния списка (список содержит четыре элемента).
  17. Вызывается метод add_before_elem для добавления элемента перед третьим элементом списка.
  18. Вызывается метод print_list для вывода измененного состояния списка (список содержит четыре элемента, добавленный элемент находится перед третьим).
  19. Вызывается метод add_before_elem для добавления элемента перед вторым элементом списка.
  20. Вызывается метод print_list для вывода измененного состояния списка (список содержит четыре элемента, добавленные элементы находятся перед вторым и третьим).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы