Переделать под классы - 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 для вывода измененного состояния списка (список содержит четыре элемента, добавленные элементы находятся перед вторым и третьим).