Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/40: Рейтинг темы: голосов - 40, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 14.05.2018
Сообщений: 214

Класс: однонаправленный список

01.05.2019, 17:58. Показов 8225. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поиогите прошу! Совсем не розбираюсь
в этом.
Создать класс - однонаправленный список, в котором определены следующие
операции: + дописывает элемент в конец списка, + = дописывает элемент в начало списка,
- удаляет указанный элемент из списка, = выполняет присвоение списков, ==,! =,>, <
> =, <= Сравнения списков, [] получения элемента списка, ++ установления
указателя на следующий элемент - установление указателя на предыдущий
элемент, () вывод части списка между заданными элементами.
Хотя бы часть!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.05.2019, 17:58
Ответы с готовыми решениями:

Создать класс Кольцевой однонаправленный список
Создать класс Кольцевой_однонаправленный_список, используя для связи элементов списка указатели. Реализовать в нем методы добавления и...

Лаба С++ Класс  однонаправленный список list
Задание по лабе Класс  однонаправленный список list. Дополнительно перегрузить следующие операции:  доступ к элементу в...

Создать класс, реализующий однонаправленный список на основе одномерного массива
Здравствуйте, уважаемые гуру, асы и прочие гении программирования С++ Помогите пожалуйста решить данную задачку, буду рад любой помощи :)...

27
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
02.05.2019, 22:57
Лучший ответ Сообщение было отмечено Taras99 как решение

Решение

Студворк — интернет-сервис помощи студентам
Taras99, здравствуйте! Мне осталось только сравнить ">", "<", ">=", "<=". Все остальное я уже сделал.

Добавлено через 52 минуты
Taras99, вот то, что мне удалось сделать для вас. Тестируйте, пишите, если вопросы будут:

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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
/*
Создать класс LinkedList, в котором определены следующие операции: 
"+" -> дописывает элемент в конец списка; 
"+=" -> дописывает элемент в начало списка;
"-" - > удаляет указанный элемент из списка;
"=" - выполняет присвоение списков; 
"==, "!=", ">", "<", "=>", "<=" -> сравнение списков; 
"[]" -> получения элемента списка по его индексу; 
"++" -> установление указателя на следующий элемент; 
"()" -> вывод части списка между заданными элементами. 
*/
 
#include <iostream>
 
    using namespace std;
 
struct Node {
    int data;
    Node* next;
};
 
class LinkedList { //Объявляем класс LinkedList
 
    private:
        
        Node* node;
 
    public:
                
        Node* head = NULL;
        
        int size() { //Функция определения размера списка
            node = head;
            int k = 0;
            while (node != NULL) {
                k++;
                node = node->next;
            }
            return k;
        }
 
        void add_front(int data) { //Функция добавления элемента в начало списка
            node = new Node;
            node->data = data;
            node->next = head;
            head = node;
        }
 
        void add_back(int data) { //Функция добавления элемента в конец списка
            node = new Node;
            node->data = data;
            node->next = NULL;
            if (head == NULL) {
                head = node;
            } else {
                Node* curr = head;
                while (curr->next != NULL) {
                    curr = curr->next;
                }
                curr->next = node;
            }
        }
 
        void del(Node** node, int key) { //Функция удаления элемента из списка
            bool flag = false;
            Node* curr, *prev;
            prev = NULL;
            for (curr = *node; curr != NULL; prev = curr, curr = curr->next) {
                if (curr->data == key) {
                    flag = true;
                    if (prev == NULL) {
                        *node = curr->next;
                    } else {
                        prev->next = curr->next;
                    }
                    delete curr;
                    return;
                } 
            }
            if (!flag) {
                cout << "No any elements found to be deleted!\n";
            }
        }
        
        void find(int index) { //Функция получения элемента по его индексу 
            if (index >= 0 && index < size()) {
                Node* node = head;
                int ans, k = 0;
                while (node != NULL) {
                    if (k == index) {
                        cout << node->data << "\n";
                        break;
                    }
                    node = node->next;
                    k++;
                }
            } else {
                cout << "Element with such an index doesn't exist!\n";
            }
        }
        
        void extract(int l, int r) { //Функция получения части списка между двумя заданными индексами (включительно)
            if (l < r && l >= 0 && r < size()) {
                Node* node = head;
                int k = 0;
                    while (node != NULL) {
                        if (k >= l && k <= r) {
                        cout << node->data << " ";
                        }
                        k++;
                        node = node->next;
                    }
                } else {
                    cout << "No such interval exists!";
                } 
        }
        
        LinkedList &operator+(const int &data) { //Перегрузка оператора добавления элемента в конец списка 
            add_back(data);
            return *this;
        }
    
        LinkedList &operator+=(const int &data) { //Перегрузка оператора добавления элемента в начало списка 
            add_front(data);
            return *this;
        }
        
        LinkedList &operator-(const int &data) { //Перегрузка оператора удаления заданного элемента из списка 
            del(&head, data);
            return *this;
        }
        
        LinkedList &operator[](const int &index) { //Перегрузка оператора получения элемента списка по его индексу 
            find(index);
            return *this;
        }
        
        LinkedList &operator()(int l, int r) { //Перегрузка оператора вызов функции для вывода части списка
            extract(l, r);
            return *this;
        }
        
        LinkedList &operator=(LinkedList obj) { //Перегрузка оператора присваивания
            swap(head, obj.head);                    
            return *this;
        } 
        
        LinkedList &operator++() { //Перегрузка оператора пре-инкремента
            head = head->next;
            return *this;
        }
        
        LinkedList &operator++(int) { //Перегрузка оператора пост-инкремента
            head = head->next;
            return *this;
        }
            
        void print() { //Функция вывода списка на экран
            node = head;
            while (node != NULL) {
                cout << node->data << " ";
                node = node->next;
            }
        }
        
        LinkedList() { //Конструктор по умолчанию
            Node* head = NULL;
        }
    };  
    
bool operator==(LinkedList &lhs, LinkedList &rhs) { //Перегрузка операции проверки двух списков на равенство
    Node* a = lhs.head;
    Node* b = rhs.head;
    while (a != NULL && b != NULL) { 
        if (a->data != b->data) {
            return false; 
        }
        a = a->next; 
        b = b->next; 
    }
    if (lhs.size() != rhs.size()) {
        return false;
    }
    return true;
}
 
bool operator!=(LinkedList &lhs, LinkedList &rhs) { //Перегрузка операции проверки двух списков на неравенство
    Node* a = lhs.head;
    Node* b = rhs.head;
    while (a != NULL && b != NULL) { 
        if (a->data != b->data) {
            return true; 
        }
        a = a->next; 
        b = b->next; 
    }
    if (lhs.size() != rhs.size()) {
        return true;
    }
    return false;
}
 
bool operator>(LinkedList &lhs, LinkedList &rhs) { //Перегрузка операции ">" для списков равной длины
    Node* a = lhs.head;
    Node* b = rhs.head;
    while (a != NULL && b != NULL) { 
        if (a->data > b->data) {
            return true; 
        }
        a = a->next; 
        b = b->next; 
    }
    return false;
}
 
bool operator<(LinkedList &lhs, LinkedList &rhs) { //Перегрузка операции "<" для списков равной длины
    Node* a = lhs.head;
    Node* b = rhs.head;
    while (a != NULL && b != NULL) { 
        if (a->data < b->data) {
            return true; 
        }
        a = a->next; 
        b = b->next; 
    }
    return false;
}
 
bool operator>=(LinkedList &lhs, LinkedList &rhs) { //Перегрузка операции ">=" для списков равной длины
    Node* a = lhs.head;
    Node* b = rhs.head;
    while (a != NULL && b != NULL) { 
        if (a->data >= b->data) {
            return true; 
        }
        a = a->next; 
        b = b->next; 
    }
    return false;
}
 
bool operator<=(LinkedList &lhs, LinkedList &rhs) { //Перегрузка операции "<=" для списков равной длины
    Node* a = lhs.head;
    Node* b = rhs.head;
    while (a != NULL && b != NULL) { 
        if (a->data <= b->data) {
            return true; 
        }
        a = a->next; 
        b = b->next; 
    }
    return false;
}
 
int main() {
    //Примеры допустимых операций:
    //1. Добавление элемента в конец списка.
    LinkedList obj1; 
    obj1 + 1; 
    obj1 + 2;
    obj1 + 3;
    obj1.print();
    cout << "\n";
    //2. Добавление элемента в начало списка.
    LinkedList obj2;
    obj2 += 4;
    obj2 += 5;
    obj2 += 6;
    obj2.print();
    cout << "\n";
    //3. Сравнение двух списков.
    if (obj2 == obj1) {
        cout << "True!";
    } else {
        cout << "False!";
    }
    cout << "\n";
    //4. Присвоение одного списка другому.
    obj2 = obj1;
    obj2.print();
    cout << "\n";
    //5. Установление указателя на следующий элемент.
    obj1++;
    obj1.print();
    cout << "\n";
    //6. Вывод части списка между двумя заданными индексами.
    obj2(0, 1);
    cout << "\n";
    //7. Получение элемента списка по заданному индексу.
    obj2[0];
    //8. Удаление заданного элемента из списка.
    LinkedList obj3;
    obj3 + 6;
    obj3 + 7;
    obj3 + 8;
    obj3 - 7; //Удаляем 7 из 6 7 8
    obj3.print();
    cout << "\n";
    system("pause");
    return 0;
}
3
0 / 0 / 0
Регистрация: 14.05.2018
Сообщений: 214
04.05.2019, 15:00  [ТС]
Fixer_84, даже не знаю как вас благодарить! Все понятно и доступно описали. Спасибо огромное!!
0
0 / 0 / 0
Регистрация: 14.05.2018
Сообщений: 214
05.05.2019, 17:06  [ТС]
Fixer_84, здравствуйте! Сможете, пожалуйста, помочь закончить код?

Создать иерархию классов ПЕРСОНА, СТУДЕНТ и студент-
Дипломник. Переопределить вывод в поток и ввод из потока,
определить конструктор копирования, операцию присваивания через соответствующие
функции базового класса.

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
#include <iostream>
#include <conio.h> 
#include <cstring>
#include <string>
 
using namespace std;
int i;
//
string nameS;
string surnameS;
//
string nameD;
string surnameD;
class Person
{
public:
void show_info() {
cout << "\nПерсона:" << endl;
};
};
class Student : public Person
{
public:
void show_info() {
cout << "\nСтудент << " << surnameS << " " << nameS << endl;
};
};
class Dyplomnuk : public Person
{
void show_info() {
cout << "\nДипломник << " << surnameD << " " << nameD << endl;
}
};
int main()
{
setlocale(0, "RUS");
 
cout << "\nСтудент:" << endl;
cout << "Введите имя:";
cin >> nameS;
cout << "Введите фамилию:";
cin >> surnameS;
cout << "\nДипломник:" << endl;
cout << "Введите имя:";
cin >> nameD;
cout << "Введите фамилию:";
cin >> surnameD;
Person* start;
Student* st = new Student;
Dyplomnuk* dp = new Dyplomnuk;
start = st;
start = dp;
Person* fox[2];
fox[0] = st;
fox[1] = dp;
for (i; i < 3; i++) {
fox[i]->show_info();
}
system("pause");
return 0;
}
Вот то, что я пробовал, но не могу закончить.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
05.05.2019, 17:29
Taras99, здравствуйте! Что-нибудь попробую сделать.
Цитата Сообщение от Taras99 Посмотреть сообщение
определить операцию присваивания через соответствующие функции базового класса.
Имеется ввиду присваивание объектов классов-потомков?
0
0 / 0 / 0
Регистрация: 14.05.2018
Сообщений: 214
05.05.2019, 17:33  [ТС]
Fixer_84, да
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
05.05.2019, 17:58
Taras99, у классов потомков (студент и студент-дипломник), будут какие-то дополнительные поля? Они унаследуют поля имя и фамилия базового класса? Объясните, пожалуйста, более подробно что значит переопределить вывод в поток и ввод из потока? Имеется ввиду операция перегрузки ввода и вывода из потока?
0
0 / 0 / 0
Регистрация: 14.05.2018
Сообщений: 214
05.05.2019, 18:07  [ТС]
Fixer_84, да, унаследуют поля имя и фамилию базового класса. Также, нужна перезагрузка ввода и вывода из потока.
0
0 / 0 / 0
Регистрация: 19.11.2020
Сообщений: 7
02.04.2021, 11:08
Taras99, Здравствуйте. Вы закончили данную программу? Могли бы скинуть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.04.2021, 11:08

Создать класс для работы со стеком, организованным как связный однонаправленный список
Люди помогите, не могу сделать лабораторную, отчисляют из универа дали 2 дня на сдачу долгов, все сдал кроме лабораторной последней......

Реализовать шаблонный класс "Несортированный однонаправленный список"
Здравствуйте! Не могу реализовать работу по шаблонам : Несортированный однонаправленный список: добавление в конец, удаление из конца,...

Добавить в список элемент после элемента с заданным инф.полем [Однонаправленный список]
Вообщем есть: Функция создание списка Функции вывода на экран Функция добавление элемента с номером k А нужно ввести...

Однонаправленный список
Задача:Создать линейный однонаправленный список из целых чисел.Вставить в список последний четный элемент после каждого нечетного элемента....

Однонаправленный Список
Как написать ф-ю добавления в конец элемента в однонаправленном списке?


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru