Переделать под классы - 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; }
Объяснение кода листинга программы
- Объявление класса List, содержащего узел (Node) для хранения значений и указателей на следующий и предыдущий узлы.
- Создание конструкторов класса List, инициализирующих узлы _head, _tail и _length списка.
- Создание деструктора класса List, освобождающего память, выделенную под узлы списка.
- Объявление метода add_elem класса List, добавляющего новый узел со значением в список.
- Объявление метода add_before_elem класса List, добавляющего новый узел со значением перед указанным узлом со следующим значением в список.
- Объявление метода print_list класса List, выводящего значения всех узлов списка.
- В функции main создается экземпляр класса List (lst).
- Вызывается метод print_list для вывода начального состояния списка (пустого списка).
- Вызывается метод add_elem для добавления первого элемента в список.
- Вызывается метод print_list для вывода измененного состояния списка (список содержит один элемент).
- Вызывается метод add_elem для добавления второго элемента в список.
- Вызывается метод print_list для вывода измененного состояния списка (список содержит два элемента).
- Вызывается метод add_elem для добавления третьего элемента в список.
- Вызывается метод print_list для вывода измененного состояния списка (список содержит три элемента).
- Вызывается метод add_elem для добавления четвертого элемента в список.
- Вызывается метод print_list для вывода измененного состояния списка (список содержит четыре элемента).
- Вызывается метод add_before_elem для добавления элемента перед третьим элементом списка.
- Вызывается метод print_list для вывода измененного состояния списка (список содержит четыре элемента, добавленный элемент находится перед третьим).
- Вызывается метод add_before_elem для добавления элемента перед вторым элементом списка.
- Вызывается метод print_list для вывода измененного состояния списка (список содержит четыре элемента, добавленные элементы находятся перед вторым и третьим).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д