C/C++

Как пишутся подобные программы? Я искал, везде с классами, хотя нужно без них. Несколько часов пытаюсь разобраться.

Организуйте односвязный упорядоченный список для хранения вещественных чисел

Продемонстрируйте  поиск элемента, добавление элемента к началу списка, в конец списка, в середину списка; удаление элемента, удаление из пустого списка.

После каждого примера вывести содержимое списка.
#include <algorithm>
#include <iostream>
using namespace std;
template<typename Type>
struct Node {
Type data;
Node* next;
Node() : next(nullptr) {}
friend ostream& operator<<(ostream& out, const Node& node) {
return out << node.data;
}
};
template<typename Type>
class List {
public:
List() : len(0), head(nullptr), tail(nullptr) {}
~List() {
if (head != nullptr) {
while (head->next != nullptr) {
auto tmp = head;
head = head->next;
delete tmp;
}
head = nullptr;
}
}
void push_back(const Type& value) {
Node<Type>* node = new Node<Type>;
node->data = value;
if (head == nullptr) {
tail = head = node;
} else {
tail->next = node;
tail = tail->next;
}
++len;
}
void push_front(const Type& value) {
Node<Type>* node = new Node<Type>;
node->data = value;
if (head == nullptr) {
tail = head = node;
} else {
node->next = head;
head = node;
}
++len;
}
Node<Type>* find(const Type& value)const {
auto beg = head;
while (beg != tail->next) {
if (value == beg->data) break;
beg = beg->next;
}
return beg;
}
void insert(Node<Type>* iter, const Type& value) {
if (iter != nullptr) {
Node<Type>* node = new Node<Type>;
node->data = value;
node->next = iter->next;
iter->next = node;
++len;
}
}
void pop_back() {
auto tmp = tail;
auto beg = head;
while (beg->next != tail) beg = beg->next;
tail = beg;
tail->next = nullptr;
delete tmp;
--len;
}
void pop_front() {
auto tmp = head;
head = head->next;
delete tmp;
--len;
}
void clear() {
while (head != nullptr) pop_front();
tail = nullptr;
}
bool empty()const {
return 0 == len;
}
size_t size()const {
return len;
}
void show()const {
if (head != nullptr) {
auto beg = head;
while (beg != tail->next) {
cout << beg->data << ' ';
beg = beg->next;
}
}
}
private:
size_t len;
Node<Type>* head;
Node<Type>* tail;
};
int main() {
List<double> list;
if (!list.empty()) list.pop_back();
if (!list.empty()) list.pop_front();
list.push_back(1.45);
list.push_back(2.84);
list.push_back(3.05);
list.push_back(5.66);
list.show();
puts("");
list.push_front(0.23);
list.show();
puts("");
auto iter = list.find(3.05);
list.insert(iter, 4.18);
list.show();
puts("");
if (!list.empty()) list.pop_back();
list.show();
puts("");
if (!list.empty()) list.pop_front();
list.show();
puts("");
list.clear();
list.show();
puts("");
cout << "size: " << list.size() << '\n';
system("pause > nul");
}

P.S. Но по уму, нужно писать класс итератора, что позволит реализовать методы begin() и end(), что существенно упростит реализацию списка и работу с ним, используя стандартные алгоритмы.
Demchenko Yan
Demchenko Yan
86 116
Лучший ответ
Без класса или структуры это будет убожество...
NA
Nurik Akhmet
10 755
Артур Галимов Со структурой