Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 23.11.2021
Сообщений: 35

Реализовать структуру, которая будет работать с двухсвязным списком

17.12.2021, 23:26. Показов 1141. Ответов 3
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста сделать эту задачу, нет времени делать идет сессия, планы горят, буду очень благодарен.


Реализовать структуру, которая будет работать с двухсвязным списком в
с++.
Необходимо:
 Описать структуру, отображающую один элемент списка;
 Описать структуру «List» в которой прописать все функции и поля, для
списка (необязательно, но желательно);
 Реализовать функции:
o добавление элемента в заданную позицию списка;
o добавление элемента в конец списка;
o удаление элемента списка по указанной позиции в списке;
o получение элемента списка по указанной позиции в списке;
o подсчет количества элементов в списке;
o Нахождение суммы и среднего значения элементов списка.
 Осуществить обработку исключений и ошибок при реализации списка;
 Продемонстрировать результаты работы со списком.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2021, 23:26
Ответы с готовыми решениями:

Реализовать программу, которая будет работать с массивом из 100 контактов
1) Написать функцию, которая просит пользователя ввести номер телефона и возвращает си-строку с введенными данными. Проверок не...

Задача с односвязным и двухсвязным списком (сортировка).
Условие: Структура содержит название издания, газета или журнал, цена экземпляра. Добавлять новые издания так, чтобы названия были...

Работа с линейным односвязным (двухсвязным) списком
Создать линейный односвязный (двухсвязный) список. Из списка удалить положительные элементы, превышающие заданную величину, а затем...

3
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,750
18.12.2021, 07:43
Лучший ответ Сообщение было отмечено jerzy_all как решение

Решение

https://referencesource.micros... 2feecc5b5c
уже написано, если даже стырите что нужно думаю не возрозят

Добавлено через 21 минуту
или вот вариант для разбора
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//https://***********/threads/s-dvusvjaznye-spiski.46883/
#include <iostream>
 
using namespace std;
 
template <typename T>
class ListD
{
struct Node
{
T data;
Node *next, *prev;
Node(T d, Node *n = 0, Node *p = 0):data(d), next(n), prev(p) {}
};
Node *head;
public:
ListD(Node *h = 0):head(h){}
~ListD();
bool isEmpty();
void insertAfter(Node *pre, T d);
void removeAfter(Node *pre);
void pushFront(T d);
T popFront();
void print();
Node *search(T d);
void create(int k);
Node *searchMinMax();
// void MinMax();
//void createFrom(List<T> *L1);
};
 
template <typename T>
ListD<T>::~ListD()
{
while (!isEmpty())
popFront();
}
 
template <typename T>
bool ListD<T>::isEmpty() 
{
return !head;
}
 
template <typename T>
void ListD<T>::insertAfter(Node *pre, T d) 
{ 
if(!pre) return;
Node *newNode = new Node(d,0,0);
newNode->prev = pre;
newNode->next = pre->next;
pre->next = newNode;
}
 
template <typename T>
void ListD<T>::removeAfter(Node *pre)
{
if (!pre || !pre->next) return;
Node *tmp = pre->next; 
if (!tmp->next)
{
pre->next = NULL;
}
else
{
tmp->next->prev = pre;
pre->next = tmp->next;
}
delete tmp; 
}
 
template <typename T>
void ListD<T>::pushFront(T d)
{
Node *newNode = new Node(d,0,0);
if(!head) {
head = newNode;
return;
}
newNode->next = head;
newNode->prev = NULL;
head->prev = newNode;
head = newNode;
}
 
template <typename T>
T ListD<T>::popFront()
{
T data;              
if(!head) return data;
Node *tmp = head;
data = head->data;
if(head->next) {
head = head->next;
head->prev = NULL;
delete tmp;
return data;
}
delete tmp;
head = NULL;
return data;
}
 
template <typename T>
typename ListD<T>::Node* ListD<T>::search(T d)
{
if(!head) return NULL;
Node* cur = head;
while(cur) {
if(cur->data == d) return cur;
cur = cur->next;
}
return NULL;
}
 
 
template <typename T>
void ListD<T>::print()
{
if(!head) return;
Node *cur = head;
while(cur) {
cout << cur->data << "; ";
cur = cur->next;
}
cout << endl;
}
 
template <typename T>
void ListD<T>::create(int k)
{
T d;
for (int i = 1; i <= k; i++)
{
cout << "Enter " << i << "-i element: ";
cin >> d;
pushFront(d);
}
}
 
template <typename T>
typename ListD<T>::Node* ListD<T>::searchMinMax()
{ T min;
T max;
Node* cur = head;
min = cur->data;
max = cur->data;
while(cur) {
if(min > cur->data ) {min = cur->data;}
if(max < cur->data ) {max = cur->data;}
cur = cur->next;
}
cout << "Min " << min << ": ";
cout << "Max " << max << ": ";
}
1
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
18.12.2021, 12:22
Лучший ответ Сообщение было отмечено jerzy_all как решение

Решение

Цитата Сообщение от jerzy_all Посмотреть сообщение
Осуществить обработку исключений и ошибок при реализации списка;
Этого делать не стал. Геморно и очень усложнит код.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#include <iostream>
#include <iomanip>
 
struct NodeBase {
    NodeBase(): next{this}, prev{this} {}
    NodeBase(NodeBase *before): next{before}, prev{before->prev} {
        next->prev = prev->next = this;
    }
    virtual ~NodeBase() {
        prev->next = next;
        next->prev = prev;
    }
    NodeBase *next;
    NodeBase *prev;
};
 
// Описать структуру, отображающую один элемент списка;
template<typename T>
struct Node : public NodeBase {
    T value;
    Node(NodeBase *before, const T &value): NodeBase{before}, value{value} {}
};
 
template<typename T, typename Node>
struct Iterator {
    using iterator_category = std::bidirectional_iterator_tag;
    using difference_type   = std::ptrdiff_t;
    using value_type        = T;
    using pointer           = value_type*;
    using reference         = value_type&;
 
    Iterator(NodeBase *node): node{node} {}
 
    reference operator*() const {
        return dynamic_cast<Node*>(node)->value;
    }
    pointer operator->() {
        return &(dynamic_cast<Node*>(node)->value);
    }
 
    Iterator &operator++() {
        node = node->next;
        return *this;
    }
    Iterator operator++(int) {
        Iterator tmp = *this;
        ++(*this);
        return tmp;
    }
 
 
    Iterator &operator--() {
        node = node->prev;
        return *this;
    }
    Iterator operator--(int) {
        Iterator tmp = *this; --(*this);
        return tmp;
    }
 
    friend bool operator== (const Iterator& a, const Iterator& b) {
        return a.node == b.node;
    };
 
    friend bool operator!= (const Iterator& a, const Iterator& b) {
        return a.node != b.node;
    };
    friend Iterator operator+(Iterator iterator, std::size_t n) {
        while (n--) {
            ++iterator;
        }
        return iterator;
    }
    friend Iterator operator-(Iterator iterator, std::size_t n) {
        while (n--) {
            --iterator;
        }
        return iterator;
    }
 
    NodeBase *node;
};
 
template<typename Container>
class BackInsertIterator {
 
    using iterator_category = std::output_iterator_tag ;
    using difference_type   = void;
    using value_type        = void;
    using pointer           = void;
    using reference         = void;
 
    BackInsertIterator(Container &container): container{&container} {}
    BackInsertIterator(Container *container): container{container} {}
 
    BackInsertIterator &operator=(const typename Container::value_type &value) {
        container->pushBack(value);
        return *this;
    }
 
    BackInsertIterator &operator*() {
        return *this;
    }
 
    BackInsertIterator &operator++() {
        return *this;
    }
    BackInsertIterator &operator++(int) {
        return *this;
    }
 
    Container *container;
};
 
// подсчет количества элементов в списке
template<typename Iterator>
typename Iterator::difference_type distance(Iterator first, Iterator last) {
    typename Iterator::difference_type result = 0;
    while (first != last) {
        ++first;
        ++result;
    }
    return result;
}
 
// Описать структуру «List» в которой прописать все функции и поля, для
// списка (необязательно, но желательно);
// я тут назвал её LinkedList, переименуйте в List, если хотите
template<typename T>
struct LinkedList {
public:
    using ConstIterator = Iterator<const T, Node<const T>>;
    using Iterator = Iterator<T, Node<T>>;
 
    LinkedList(): base{} {}
    LinkedList(const LinkedList<T> &other): base{} {
        std::copy(other.begin(), other.end(), BackInsertIterator(this));
    }
    LinkedList<T> &operator=(const LinkedList<T> &other) {
        if (this != &other) {
            clear();
            std::copy(other.begin(), other.end(), BackInsertIterator(this));
        }
        return *this;
    }
    ~LinkedList() {
        clear();
    }
 
    // добавление элемента в конец списка;
    Iterator pushBack(const T &value) {
        return insert(end(), value);
    }
 
    Iterator pushFront(const T &value) {
        return insert(begin(), value);
    }
 
    // добавление элемента в заданную позицию списка
    Iterator insert(Iterator position, const T &value) {
        return new Node{position.node, value};
    }
 
    // удаление элемента списка по указанной позиции в списке
    Iterator erase(Iterator position) {
        delete position.node;
    }
 
    // получение элемента списка по указанной позиции в списке
    // используйте *(begin() + x)
    Iterator begin() {
        return base.next;
    }
    ConstIterator begin() const {
        return base.next;
    }
    Iterator end() {
        return &base;
    }
    ConstIterator end() const {
        return &base;
    }
 
    typename Iterator::difference_type getSize() const {
        return distance(begin(), end());
    }
 
    bool isEmpty() const {
        return base.next == &base;
    }
 
    void clear() {
        while (!isEmpty()) {
            delete base.next;
        }
    }
 
private:
    NodeBase base;
};
 
// Нахождение суммы элементов списка
template<typename Iterator, typename T>
T accumulate(Iterator first, Iterator last, T init) {
    for (; first != last; ++first) {
        init = init + *first;
    }
    return init;
}
 
// Продемонстрировать результаты работы со списком
int main() {
 
    LinkedList<int> a;
    a.insert(a.begin(), 8);
 
    // добавление элемента в конец списка
    a.pushBack(9);
    a.insert(a.end(), 10);
 
    // добавление элемента в заданную позицию списка
    a.insert(a.begin() + 1, 2);
 
    // получение элемента списка по указанной позиции в списке
    std::size_t size = distance(a.begin(), a.end());
 
    // подсчет количества элементов в списке
    std::cout << size << std::endl;
 
    // получение элемента списка по указанной позиции в списке;
    std::cout << *(a.begin() + 2) << std::endl;
 
    // Нахождение суммы и среднего значения элементов списка
    int sum = ::accumulate(a.begin(), a.end(), 0);
    std::cout << "Sum: " << sum
        << ", average: " << std::fixed << std::setprecision(2) << sum / static_cast<double>(size) << std::endl;
 
    for (const auto &i : a) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
 
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 23.11.2021
Сообщений: 35
20.12.2021, 17:20  [ТС]
Спасибо вам большое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.12.2021, 17:20
Помогаю со студенческими работами здесь

Ошибка 0xC0000005 при работе с двухсвязным списком
В общем и целом, пытаюсь реализовать дерево как двунаправленный список для сортировки заданного массива симметричным обходом. Получается,...

Создать программу для работы с двунаправленным (двухсвязным) линейным списком
Создать программу для работы с двунаправленным (двухсвязным) линейным списком. Реализовать функции: создание списка из случайных целых...

Написать написать програму с двухсвязным списком кто может?
Графически в любом редакторе изобразить работу &quot;списков&quot; соответственно к &quot;типу&quot;. Написать программу, демонстрирующую основные...

разработать программу, которая будет использовать структуру в С
1 . создать программу, которая будет использовать структуру human с элементами surname , name , age . Разработать создания и вывода на...

Если реализовать IDisposable то он не будет работать?
Не пойму, этот метод вызываться при уборке мусора. И что, если я его реализую, например так: protected void Dispose() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru