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

Поиск покупателя по имени в односвязном списке

11.09.2022, 08:15. Показов 820. Ответов 4

Author24 — интернет-сервис помощи студентам
Добрый день. Я не могу понять, как мне реализовать функцию поиска покупателя по имени, помогите пожалуйста

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
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <Windows.h>
using namespace std;
 
struct Buyer // Структура "Покупатель"
{
    string date; // Дата покупки
    string fio; // ФИО
    string address; // Домашний адрес
    string phone; // Номер телефона
    float sum; // Сумма покупки
};
 
struct List // Cтруктура линейный динамический спискок
{
    Buyer info; // Информация хранящиеся в элементах списка
    List* next; // Указатель на следующий элемент списка
};
 
// Прототипы функций
// т.е. заголовки функций, а их реализации находится после реализации функции main
void enter_new(Buyer& st); // Функция для ввода информации о новом покупателе с клавиатуры
void sort(List*& head); // Функция для сортировка списка
int change(List*& head, int number); // Функция для изменения информации с номером number
int del(List*& head, List*& end, int number); // Функция для удаления элемента списка с номером number
int find(List*& head, Buyer& st, string fio);
void out(List* head); // Функция для вывода списка на экран
void save(List* head, string a); // Функция для сохранения списка в файл
void load(List*& head, List*& end, Buyer& st, string a); // Функция для чтения списка из файла
void add(List*& head, List*& end, Buyer st, string date, string fio, string address, string phone, float sum); // Функция для добавления элемента st в список 
int length(List* head); // Функция для получения количества элементов в списке head
void clear(List*& head, List*& end); // Функция для очистки памяти занятой списком
 
int main() // Главная функция
{
    setlocale(LC_ALL, "Rus");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Buyer st;
 
    List* head = NULL, * end = NULL; // Объявляем указатели на начало и конец списка
    int choise;
    int number;
    do
    {
        system("cls"); // Очищаем экран
 
        // Выводим меню
        cout << "1. Добавить элемент в список" << endl;
        cout << "2. Отсортировать элементы по алфавиту" << endl;
        cout << "3. Изменить элемент списка" << endl;
        cout << "4. Удалить элемент из списка" << endl;
        cout << "5. Поиск элемента" << endl;
        cout << "6. Вывод таблицы" << endl;
        cout << "7. Сохранить список в файл" << endl;
        cout << "8. Чтение списка из файла" << endl;
        cout << "9. Очистить список" << endl;
        cout << "10. Выход" << endl;
        cout << "Выберете действие: ";
        cin >> choise;
        cout << endl;
 
        switch (choise) // В зависимости от того, что выбрали, выполняем определенные действия
        {
        case 1:
        {
            enter_new(st); // Вызываем функцию для получения нового элемента "Покупатель"
            add(head, end, st, st.date, st.fio, st.address, st.phone, st.sum); // Добавляем  покупателя в  список 
            cout << "Покупатель добавлен\n";
            break;
        }
 
        case 2:
        {
            sort(head); // Вызываем функция для сортировки данных о покупателе по алфавиту
            cout << "Список отсортирован\n";
            break;
        }
 
        case 3:
        {
            cout << "Номер элемента для изменения: ";
            cin >> number;
            // Вызываем метод для изменения данных о покупателе
            // И если функция равна 0 значит всё прошло успешно
            // Иначе данные не были изменены
            if (change(head, number) == 0) cout << "Элемент с номером " << number << " изменён\n";
            else cout << "Элемента с номером " << number << " нет\n";
            break;
        }
 
        case 4:
        {
            cout << "Номер элемента для удаления: ";
            cin >> number;
            // Вызываем метод для удаления покупателя
            // И если функция равна 0 значит всё прошло успешно
            // Иначе покупатель не был удален
            if (del(head, end, number) == 0) cout << "Элемент с номером " << number << " удалён\n";
            else cout << "Элемента с номером " << number << " нет\n";
            break;
        }
 
        case 5:
        {
            cout << "Введите ФИО покупателя: "; 
            getline(cin, st.fio);
            cin.get();
            if (find(head, st, st.fio) != -1)
            {
                cout << "Такой покупатель есть." << endl;
            }
            else cout << "Такой покупатель отсутствует." << endl;
            break;
        }
 
        case 6:
        {
            out(head); // Вызываем функцию для вывода информации о покупателе на экран
            break;
        }
 
        case 7:
        {
            int number;
            string a;
            cout << "1. Сохранить в файл по умолчанию" << '\n';
            cout << "2. Ввести путь самостоятельно (Пример: 'D:\\file.txt')" << endl;
            cout << "Выберите действие: ";
            cin >> number;
            if (number == 1)
            {
                a = "file.txt";
                save(head, a);
            }
            else
            {
                cout << "Введите путь к файлу: ";
                cin >> a;
                save(head, a);
            }
            break;
        }
 
        case 8:
        {
            int number;
            string a;
            cout << "1.Читать из файла по умолчанию" << '\n'
                << "2.Ввести путь самостоятельно (Пример:'D:\\input.txt')" << endl;
            cout << "Выберите действие: "; cin >> number;
            if (number == 1)
            {
                a = "input.txt";
                load(head, end, st, a);
            }
            else
            {
                cout << "Введите путь к файлу: ";
                cin >> a;
                load(head, end, st, a);
            }
            break;
        }
 
        case 9:
        {
            clear(head, end);
            cout << "Вы очистили список" << endl;
            break;
        }
 
        case 10:
        {
            return 0;
        }
        }
        if (choise > 0 && choise <= 8) system("pause"); // Если выбранное действие попадает в промежуток от 1 до 8, то задерживаем результат на экране
    } while (choise != 0);
    return 0;
}
 
void enter_new(Buyer& st) // Функция для ввода информации о новом покупателе с клавиатуры
{
    cout << "Введите дату покупки: ";
    cin >> st.date;
    cin.get(); // Для остановки закрытия окна консоли
 
    cout << "Введите ФИО покупателя: ";
    getline(cin, st.fio);
 
    cout << "Введите домашний адрес покупателя: ";
    getline(cin, st.address);
 
    cout << "Введите номер телефона покупателя: ";
    cin >> st.phone;
    cin.get(); // Для остановки закрытия окна консоли
 
    cout << "Введите сумму покупки покупателя: ";
    cin >> st.sum;
    cin.get(); // Для остановки закрытия окна консоли
}
 
void sort(List*& head) // Функция для сортировка списка
{
    List* t = head, * tt;
    Buyer temp;
    while (t != NULL)
    {
        tt = t->next;
        while (tt != NULL)
        {
            if (tt->info.fio < t->info.fio)
            {
                temp = tt->info;
                tt->info = t->info;
                t->info = temp;
            }
            tt = tt->next;
        }
        t = t->next;
    }
}
 
int change(List*& head, int number) // Функция для изменения информации с номером number
{
    int n = length(head); // Получаем количество элементов списка
    if (number > n || number <= 0 || n == 0) // Если number больше количества элементов списка или меньше или равно нуля или список пуст то
    {
        return 1; //возвращаем результат работы функции = 1 т.е. есть ошибки
    }
    int i = 0; // Обнуляем текущий элемент списка
    List* t = head;
    while (t != NULL) // Пока не конец списка
    {
        i++; // Увеличиваем номер на 1
        if (i == number) // Если номер текущего элемента равен номеру искомого то
        {
            Buyer st;
            enter_new(st); // Вызываем функцию для получения информации о новом покупателе
            t->info = st; // И в номер с номером number заносим данные о новом покупателе
            break; // Прерываем цикл
        }
        t = t->next; // Переходим к следующему элементу
    }
    return 0; // Оповещаем о корректном изменении
}
 
int del(List*& head, List*& end, int number) // Функция для удаления элемента списка с номером number
{
    int n = length(head); // Получаем количество элементов списка
    if (number > n || number <= 0 || n == 0) // Если number больше количества элементов списка или меньше или равно нуля или список пуст то
    {
        return 1; // Возвращаем результат работы функции = 1, т.е. есть ошибки
    }
    List* t = head, * tt = head;
    if (number == 1) // Если необходимо удалить первый элемент списка то
    {
        t = head; // Запоминаем первый элемент списка в переменной t
        head = head->next; // Переходим к следующему элементу
        delete t; // Удаляем первый элемент
        // Если голова списка стала пустой то
        // Конец списка ставим пустым
        if (head == NULL) end = NULL;
    }
    else // Иначе
    {
        tt = head; // Запоминаем текущий элемент списка
        t = head->next; // Запоминаем последующий элемент списка
        int i = 1; // Индексацию начинаем с 1 т.к. первый элемент уже просмотрен
        while (t != NULL) // Пока не конец списка
        {
            i++; // Увеличиваем индекс на 1
            if (i == number) // Если i == number, т.е. номер текущего элемента равен номеру удаляемого то
            {
                tt->next = t->next; // Переставляем указатели
                break; // Прерываем цикл
            }
            // Переходим к следующим элементам
            tt = tt->next;
            t = t->next;
        }
        if (number == n) end = tt; // Если удаляемый элемент является последним то меняем указатель на конец списка
        delete t; // Освобождаем память занятую под элемент с номером number
    }
    return 0; // Оповещаем о корректном удалении
}
 
int find(List*& head, Buyer& st, string fio) // Функция для поиска по имени
{
    int i = 0;
    while (head != NULL)
    {
        if (head->info.fio == fio)
            return i;
        i++;
        head = head->next;
    }
    return -1;
}
 
void out(List* head) // Функция для вывода списка на экран
{
    if (head == NULL) // Если head = NULL значит список пуст
    {
        cout << "Список пуст\n";
        return;
    }
 
    // Выводим шапку для вывода информации
    cout << setw(0) << "№"
        << setw(20) << "Дата покупки"
        << setw(30) << "ФИО покупателя"
        << setw(40) << "Домашний адрес покупателя"
        << setw(50) << "Номер телефона покупателя"
        << setw(60) << "Сумма покупки покупателя"
        << endl;
 
    for (int i = 1; head != NULL; i++)
    {
        cout << setw(0) << i
            << setw(20) << head->info.date
            << setw(30) << head->info.fio
            << setw(40) << head->info.address
            << setw(50) << head->info.phone
            << setw(60) << head->info.sum
            << endl;
        head = head->next;
    }
}
 
void save(List* head, string a) // Функция для сохранения списка в файл
{
    ofstream out;
    out.open(a);
    if (out.is_open())
    {
        out << "№"
            << setw(20) << "Дата покупки"
            << setw(30) << "ФИО покупателя"
            << setw(40) << "Домашний адрес покупателя"
            << setw(50) << "Номер телефона покупателя"
            << setw(60) << "Сумма покупки покупателя"
            << endl;
 
        for (int i = 0; head != NULL; i++)
        {
            out << i << setw(20) << head->info.date
                << setw(30) << head->info.fio
                << setw(40) << head->info.address
                << setw(50) << head->info.phone
                << setw(60) << head->info.sum
                << endl;
            head = head->next;
        }
        cout << "Данные сохранены в файл\n";
    }
    else cout << "Сохранение не удалось" << endl;
    out.close();
}
 
void load(List*& head, List*& end, Buyer& st, string a)
{
    ifstream in;
    in.open(a);
    if (in.is_open())
    {
        while (!in.eof())
        {
            in >> st.date;
            in >> st.fio;
            in >> st.address;
            in >> st.phone;
            in >> st.sum;
            add(head, end, st, st.date, st.fio, st.address, st.phone, st.sum);
        }
    }
    else cout << "Чтение из файла не удалось" << endl;
    in.close();
}
 
void add(List*& head, List*& end, Buyer st, string date, string fio, string address, string phone, float sum) // Функция для добавления элемента st в список 
{
    if (head == NULL) // Если список ещё не создан,то
    {
        head = new List; // Выделяем место под голову списка
        head->next = NULL; // Зануляем указатель на следующий элемент
        head->info = st; // Заносим данные в голову списка
        end = head; // Конец списка устанавливаем в head
    }
    else // Иначе
    {
        List* x = new List; // Выделяем место под новый элемент
        x->info = st; // Заносим туда данные
        x->next = NULL; // Указатель на следующий элемент ставим в NULL т.е. его не существует пока что
        end->next = x; // И связываем новый элемент с концом списка
        end = x; // И концу списка присваем x
    }
}
 
int length(List* head) // Функция для получения количества элементов в списке head
{
    int n = 0; // Обнуляем количество элементов списка
    while (head != NULL) // Пока не конец списка делаем
    {
        n++; // Увеличиваем количество элементов на 1
        head = head->next; // Переходим к следующему звену списка
    }
    return n; // Возвращаем количество элементов списка
}
 
void clear(List*& head, List*& end) // Функция для очистки памяти занятой списком
{
    List* t;
    while (head != NULL) // Пока не конец списка, делаем
    {
        t = head->next; // Переходим к следующему элементу
        delete head; // Очищаем память занятой под head
        head = t; // Заносим в head значение t
    }
    end = NULL;
}
В функции enter_new я ввожу имя, оно добавляется в список, но в поиске имя не находится

C++
1
2
3
4
5
6
7
8
9
10
11
12
        case 5:
        {
            cout << "Введите ФИО покупателя: "; 
            getline(cin, st.fio);
            cin.get();
            if (find(head, st, st.fio) != -1)
            {
                cout << "Такой покупатель есть." << endl;
            }
            else cout << "Такой покупатель отсутствует." << endl;
            break;
        }
C++
1
2
3
4
5
6
7
8
9
10
11
12
int find(List*& head, Buyer& st, string fio) // Функция для поиска по имени
{
    int i = 0;
    while (head != NULL)
    {
        if (head->info.fio == fio)
            return i;
        i++;
        head = head->next;
    }
    return -1;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.09.2022, 08:15
Ответы с готовыми решениями:

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

Поиск элемента в односвязном списке
задачу решил, всем спасибо. кому интересен результат, или то как решит задачу - в личку

Поиск и удаление в односвязном списке
Помогите с удаление элемента по ключу(номеру этажа). При удалении 2-го элемента в списке, удаляется вместе с 1-ым, но если удалять 3, то 2...

4
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
37641 / 20889 / 4285
Регистрация: 12.02.2012
Сообщений: 34,333
Записей в блоге: 14
11.09.2022, 08:31 2
Цитата Сообщение от Nefr Посмотреть сообщение
Я не могу понять, как мне реализовать функцию поиска покупателя по имени, помогите пожалуйста
- начать с начала списка. Просматривать элемент за элементом. Если имя совпадает с искомым - значит нашли. Эта функция реализована и расположена в строках 292-303. Да ты сам ли писал этот код?
0
0 / 0 / 0
Регистрация: 11.09.2022
Сообщений: 3
11.09.2022, 08:39  [ТС] 3
Проблема в том, что эта функция не работает, выводит каждый раз: else cout << "Такой покупатель отсутствует." << endl;
0
Неэпический
 Аватар для Croessmah
18124 / 10709 / 2063
Регистрация: 27.09.2012
Сообщений: 26,997
Записей в блоге: 1
11.09.2022, 08:44 4
Лучший ответ Сообщение было отмечено Nefr как решение

Решение

Цитата Сообщение от Nefr Посмотреть сообщение
C++
1
2
3
find(List*& head
//...
head = head->next;
Зачем ссылка на указатель?
Вы же в курсе, что вы так список испоганите во время поиска?
2
0 / 0 / 0
Регистрация: 11.09.2022
Сообщений: 3
11.09.2022, 08:54  [ТС] 5
Спасибо за помощь, теперь все ищет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2022, 08:54
Помогаю со студенческими работами здесь

Поиск элемента в односвязном списке
Нужно вбить фамилию и найти рабочего с заданной фамилией и вывести всю информацию о нём. Это мой метод для поиска UnicodeString...

Поиск цикла в односвязном списке
есть односвязный список struct List { int value; struct List *next; } _list; требуется написать функцию bool...

Поиск по содержимому в односвязном списке
Проблема в поиске по содержимому, выводит ерунду, но при этом все верно находит. К примеру есть 3 записи, ищешь вторую - выводит первую,...

поиск элемента по значению в односвязном списке
накидайте примеров информация запрашивается у пользователя

Удаление и поиск элемента в односвязном списке
Вот мои функции, но они почему то не работают: функция удаления удаляет всегда голову, а функция поиска находит все элементы. ITEM*...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Нестандартные приемы работы с итераторами в C++
stackOverflow 02.03.2025
Итераторы - один из краеугольных камней C++, предоставляющий универсальный механизм обхода и манипуляции данными в контейнерах. Появившись как замена небезопасным указателям, они эволюционировали от. . .
Лексический анализ и регулярные выражения в C++26
stackOverflow 02.03.2025
Лексический анализ - ядро любого компилятора и инструмента обработки текста. Каждый программист сталкивается с задачами парсинга строк, обработки файлов конфигурации или анализа пользовательского. . .
Подробно о std::mdspan в C++23
stackOverflow 02.03.2025
Работа с многомерными массивами данных традиционно была одной из сложных задач в C++. Программистам приходилось создавать собственные абстракции или использовать сторонние библиотеки для эффективной. . .
Колмогоровская сложность в C++: Путь к совершенному коду
stackOverflow 02.03.2025
Абстрактная математическая теория Колмогорова стала мощным средством оценки и улучшения программного кода. Сложность алгоритма - не только в его вычислительной эффективности, но и в том, насколько. . .
Изменения в C# 14
stackOverflow 02.03.2025
Одно из самых значимых изменений в C# 14 - поддержка коллекционных выражений, которые позволяют создавать и инициализировать коллекции с помощью нового лаконичного синтаксиса. Это нововведение. . .
Разработка кроссплатформен­­­­ного мобильного приложения для iOS/Android на C++
bytestream 02.03.2025
C++ как язык программирования высокого уровня с прямым доступом к аппаратным ресурсам позволяет создавать приложения, работающие одинаково быстро как на iOS, так и на Android устройствах. Ни для кого. . .
Аутентификация/авторизация на Golang
bytestream 02.03.2025
Go предлагает множество возможностей для создания надежных систем аутентификации. Встроенные криптографические пакеты, высокая производительность и простота параллельной обработки запросов делают его. . .
Нововведения TypeScript 5.8
bytestream 02.03.2025
TypeScript 5. 8 приносит много возможностей и оптимизаций, которые существенно расширяют границы типобезопасного программирования на JavaScript. Эта версия включает ряд значительных улучшений в работе. . .
Выполнение кода в игровом цикле Unity с использованием не-MonoBehaviour классов C#
bytestream 02.03.2025
Обычный подход к разработке игр на Unity тесно связан с использованием MonoBehaviour - базового класса для скриптов, обеспечивающего доступ к игровому циклу через события Update, FixedUpdate и. . .
Управление инстанцирование­м вложенных классов в C#
bytestream 02.03.2025
Вложенные классы в C# - мощное средство для создания тесно связанных типов данных и логики. Такие классы определяются внутри других классов и обеспечивают высокий уровень инкапсуляции, позволяя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru