Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/32: Рейтинг темы: голосов - 32, средняя оценка - 4.69
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214

Добавить книгу в начало списка

07.04.2021, 17:05. Показов 6920. Ответов 66
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, нужна помощь с добавление информации о книге в односвязном списке в начало этого списка (функция). Не знаю, как это сделать, и ещё не знаю как сделать функцию добавления книги в позицию, отсортированную по имени в алфавитном порядке.
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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#include <Windows.h>
 
using namespace std;
 
struct LIBRARY
{
    char nomer[30];
    char FIO[30];
    char nazvanie[40];
    int Year;
    int kolvo;
};
 
struct STR
{
    LIBRARY* Library;
    STR* next;
};
 
STR* create(LIBRARY* Library) //начальное формирование списка
{
    STR* root = new STR;
    root->Library = Library;
    root->next = NULL;
    return root;
}
 
 
 
void add(LIBRARY* Library, STR* root) //добавление нового элемента в конец списка
{
    while (root->next)
        root = root->next;
    root->next = new STR;
    root->next->Library = Library;
    root->next->next = NULL;
}
 
void AddFirst(LIBRARY* Library, STR* root)
{
//Добавление элемента в начало списка
}
 
void printLIBRARY(LIBRARY* Library) //вывод на экран  
{
 
    cout << "Номер книги: " << Library->nomer << endl;
    cout << "ФИО: " << Library->FIO << endl;
    cout << "Название: " << Library->nazvanie << endl;
    cout << "Год: " << Library->Year << endl;
    cout << "Количество: " << Library->kolvo << endl;
    cout << endl;
 
}
LIBRARY* makeLIBRARY() //добавление книги
{
    cout << "Введите информацию о книге:" << endl;
    LIBRARY* Library = new LIBRARY;
    fflush(stdin);
    cout << "Введите номер книги: ";
    cin.getline(Library->nomer, 30);
 
    cout << "Введите ФИО автора книги: ";
    cin.getline(Library->FIO, 30);
 
    cout << "Введите название книги: ";
    cin.getline(Library->nazvanie, 40);
 
    cout << "Введите год выпуска книги: ";
    cin >> Library->Year;
 
    cout << "Введите количество книг: ";
    cin >> Library->kolvo;
 
    return Library;
}
int choice()
{
    int answer;
    cout << "Главное меню:" << endl;
    cout << "1. Добавить новую книгу в список (если уже был произведён ввод, то новая книга поместится в конец списка)" << endl;
    cout << "2. Вывести всю информацию о книгах" << endl;
    cout << "3. Очистить экран" << endl;
    cout << "4. Выход" << endl;
    cout << "5. Добавить книгу в начало списка" << endl;
    cout << "Выберите действие: ";
    (cin >> answer).get();
    fflush(stdin);
    if (answer >= 1 && answer <= 5)
        return answer;
    else
        return 0;
}
 
STR* search_and_del(STR* str)
{
    STR* last = str, * root = str;
    char qwe[30];
    char qw[30], q[1];
    cout << "Введите номер книги: " << endl;
    cin.getline(qwe, 30);
    while (root)
    {
        if (!strcmp(qwe, root->Library->nomer))
        {
            {
                printLIBRARY(root->Library);
                cout << "Вы точно желаете удалить информацию о книге? (y/n) " << endl;// Удаление записи
                char c;
                cin.get(c);
                if (c == 'y')
                {
                    root->Library = NULL;
                    if (last == root)
                    {
                        str = root->next;
                    }
                    else last->next = root->next;
                }
                while (cin.get(c) && c != '\n');
                last = root;
                root = root->next;
            }
        }
        else if (strcmp(qwe, root->Library->nomer))
            root = root->next;
    }
 
    cout << "Успех!" << endl;
    return str;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    STR* root = NULL;
    int ch;
    while (1)
    {
        ch = choice();
        if (ch == 1)
        {
            cout << endl;
            if (root == NULL)
                root = create(makeLIBRARY());
            else
                add(makeLIBRARY(), root);
        }
 
        else if (ch == 2)
        {
            cout << endl;
            int i = 0;
            int N = 0;
 
            STR* proot = root;
            while (root)
            {
                N++;
                root = root->next;
            }
 
            LIBRARY* buf;
            LIBRARY** pLibrary = new LIBRARY * [N];
            root = proot;
 
            while (root)
            {
                pLibrary[i] = root->Library;
                root = root->next;
                i++;
            }
 
            root = proot;
 
 
            for (i = 0; i < N; i++)
                printLIBRARY(pLibrary[i]);
 
        }
 
        else if (ch == 3)
        {
            system("cls");
        }
 
        else if (ch == 4)
        {
            break;
            cout << endl;
        }
        
        else if (ch == 5)
        {
                //?
        }
    }
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2021, 17:05
Ответы с готовыми решениями:

Работа со списком...Не могу добавить функцию добавить элементы в начало списка...
В моей программе есть функция добавить элементы, она добавляет элементы в конец списка, уже очень долго не могу сделать функцию добавить...

Получить указатель на элемент двунаправленного списка, добавить значение в начало списка и очистить его
Нужно создать двунаправленный список //вроде так, но не уверен struct Double_List {//структура данных int Data;...

Даны числа D1 и D2 и указатель P0 на один из элементов непустого двусвязного списка. Добавить в начало списка новый
Даны числа D1 и D2 и указатель P0 на один из элементов непустого двусвязного списка. Добавить в начало списка новый элемент со значением D1...

66
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 12:51  [ТС]
Студворк — интернет-сервис помощи студентам
oleg-m1973, Правильно заменила?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PBook FindPrev(PBook Head, char NewUdk[]) //поиск узла
{
    PBook p = nullptr;
    while (Head && strcmp(Head->udknum, NewUdk) != 0)
    {
        p = Head;
        Head = Head->next;
    }
    return p;
}
 
PBook FindPlacePrev(PBook Head, char NewBName[]) //добавление в нужное место по алфавиту
{
    PBook q = nullptr;
    while (Head && (strcmp(Head->bookname, NewBName) > 0))
    {
        q = Head;
        Head = Head->next;
    }
    return q;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.04.2021, 12:54
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Правильно заменила?
Правильно
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 12:58  [ТС]
oleg-m1973, Как их вызвать теперь правильно?

Добавлено через 21 секунду
Я так понимаю нельзя делать как я написала
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.04.2021, 13:02
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
PBook Head = NULL, p, where, q = NULL;
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
if (q && Find(Head, q->udknum)) //?
+++

Добавлено через 52 секунды
Кстати, что это вообще за q? Там просто название нужно, строка
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 13:11  [ТС]
oleg-m1973, написано, что это защита от дурака
Миниатюры
Добавить книгу в начало списка   Добавить книгу в начало списка   Добавить книгу в начало списка  

0
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 16:36  [ТС]
oleg-m1973, Не получается вызвать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        else if (ch == 5)
        {
            cout << "Введите номер УДК для поиска: ";
            cin >> q->udknum;
 
            if (q && Find(Head, q->udknum))
            {
                cout << "Номер книги: " << q->udknum << endl;
                cout << "ФИО: " << q->fio << endl;
                cout << "Название: " << q->bookname << endl;
                cout << "Год: " << q->year << endl;
                cout << "Количество: " << q->kolvo << endl;
                cout << endl;
                cout << endl;
            }
        }
Добавлено через 1 минуту
Точнее как, программа то начинает работать, но, как мне правильно сделать ввод УДК этого, а то если так, то исключение вызывается

Добавлено через 1 минуту
Или мне вообще не через q это надо делать, а через p? Просто если брать 4 пункт с выводом на экран того, что мы ввели, то там через p делаем
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.04.2021, 16:39
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Не получается вызвать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
else if (ch == 5)
{
    char udknum[256];
    cout << "Введите номер УДК для поиска: ";
    cin >> udknum;
 
    q = Find(Head, udknum);
    if (q)
    {
        cout << "Номер книги: " << q->udknum << endl;
        cout << "ФИО: " << q->fio << endl;
        cout << "Название: " << q->bookname << endl;
        cout << "Год: " << q->year << endl;
        cout << "Количество: " << q->kolvo << endl;
        cout << endl;
        cout << endl;
    }
}
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 19:09  [ТС]
oleg-m1973, Спасибо, сделала, ещё туда добавила удаление на букву у, работает, осталось добавить книгу в нужную позицию по алфавиту

Добавлено через 1 минуту
oleg-m1973, А эта функция, получается, вставляет книгу в позицию по алфавиту? Т.е. если у нас 1 книга с названием на а, а вторая с названием на г, то, если у третьей название на в, то она встанет между ними?
C++
1
2
3
4
5
6
7
8
9
10
PBook FindPlacePrev(PBook Head, char NewBName[]) //добавление в нужное место по алфавиту
{
    PBook q = nullptr;
    while (Head && (strcmp(Head->bookname, NewBName) > 0))
    {
        q = Head;
        Head = Head->next;
    }
    return q;
}
Добавлено через 4 минуты
Это мы сюда должны добавить сначала формирование книги, а потом уже эту функцию проверки?
C++
1
2
3
4
5
        else if (ch == 3)
        {
            char NewBName[256];
            FindPlacePrev(Head, NewBName);
        }
Добавлено через 1 час 14 минут
Вот, я написала такую штуку, она добавляет новый узел, но только в конец, где-то промахнулась
C++
1
2
3
4
5
6
7
8
9
10
11
        else if (ch == 3)
        {
            p = CreateBook();
            where = FindPlacePrev(Head, NewBName);
            if (!where)
            {
                AddLast(Head, p);
            }
            else
                AfterBefore(Head, where, p);
        }
Добавлено через 31 секунду
Наверное, просто NewBName Пустой оказывается, она нигде не вводится, я не знаю, как это слепить

Добавлено через 6 минут
Так, вроде, тоже не вставляет в нужную позицию
C++
1
2
3
4
5
6
7
8
9
10
11
        else if (ch == 3)
        {
            p = CreateBook();
            where = FindPlacePrev(Head, p->bookname);
            if (!where)
            {
                AddLast(Head, p);
            }
            else
                AfterBefore(Head, where, p);
        }
Добавлено через 45 минут
Вроде бы я проверила через cout и p->bookname правильно выводит значение поля, которое вводим, тогда я не понимаю, почему он не куда надо ставит
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.04.2021, 19:45
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
Вроде бы я проверила через cout и p->bookname правильно выводит значение поля, которое вводим, тогда я не понимаю, почему он не куда надо ставит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void AddAfter(PBook &Head, PBook pos, PBook NewBook) //добавление узла после заданного
{
    if (!pos)
    {
        NextBook->next = Head;
        Head = NextBook;
    }
    else
    {
        NewBook->next = p->next;
        p->next = NewBook;
    }
}
 
..............
else if (ch == 3)
{
    p = CreateBook();
    AddAfer(Head, FindPlacePrev(Head, p->bookname), p`);
}
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 19:58  [ТС]
oleg-m1973, Тут NewBook? А то Next он пишет, что не определён и в else он пишет, что p не определён
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.04.2021, 19:59
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
NewBook->next = pos->next;
        pos->next = NewBook;
+++
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 20:00  [ТС]
И в этой функции он пишет мало аргументов, дописать Book pos?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void AfterBefore(PBook& Head, PBook p, PBook NewBook) //добавление узла перед заданным
{
    PBook q = Head;
    if (Head == p)
    {
        AddFirst(Head, NewBook); //вставка перед новым узлом
        return;
    }
    while (q && q->next != p) //ищем узел, за которым следует р
    {
        q = q->next;
        if (q) //если нашли, то
        {
            AddAfter(q, NewBook); //добавляем новый узел после него
        }
    }
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.04.2021, 20:02
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Тут NewBook? А то Next он пишет, что не определён и в else он пишет, что p не определён
Да, NewBook

Добавлено через 1 минуту
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
И в этой функции он пишет мало аргументов, дописать Book pos?
Где именно? Добавь Head начало - AddAfer(Head,
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 20:04  [ТС]
Вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void AfterBefore(PBook& Head, PBook p, PBook NewBook) //добавление узла перед заданным
{
    PBook q = Head;
    if (Head == p)
    {
        AddFirst(Head, NewBook); //вставка перед новым узлом
        return;
    }
    while (q && q->next != p) //ищем узел, за которым следует р
    {
        q = q->next;
        if (q) //если нашли, то
        {
            AddAfter(Head, q, NewBook); //добавляем новый узел после него
        }
    }
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.04.2021, 20:06
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
void AfterBefore(PBook& Head, PBook p, PBook NewBook) //добавление узла перед заданным
Что это вообще за функция, зачем она нужна? Там достаточно одной AddAfer
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 20:11  [ТС]
oleg-m1973, Вот так теперь должно быть? в 1 if добавился параметр от AddAfter, просто p добавить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        if (ch == 1)
        {
            cout << endl;
            if (Head == NULL)
            {
                Head = CreateBook();
            }
            else
                AddAfter(Head, p, CreateBook());
        }
 
        else if (ch == 2)
        {
            AddFirst(Head, CreateBook());
        }
 
        else if (ch == 3)
        {
            p = CreateBook();
            AddAfter(Head, FindPlacePrev(Head, p->bookname), p);
        }
Добавлено через 46 секунд
oleg-m1973, Ну там она функция вставляет перед заданным, а другая после заданного, по идее, они должны были это делать

Добавлено через 1 минуту
Ан нет, на p ругается
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.04.2021, 20:13
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Вот так теперь должно быть? в 1 if добавился параметр от AddAfter, просто p добавить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PBook GetTail(PBook Head)
{
    if (Head)
        while(Head->next)
            Head = Head->next;
 
    return Head;
}
 
.....................
if (ch == 1)
    AddAfter(Head, GetTail(Head), CreateBook());
else if (ch == 2)
    AddAfter(Head, nullptr, CreateBook());
else if (ch == 3)
{
    PBook p = CreateBook();
    AddAfter(Head, FindPlacePrev(Head, p->bookname), p);
}
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 20:39  [ТС]
oleg-m1973, Он при 3 выборе в начало списка кинул узел, хотя первая буква была в названии книги А (1 узел), 2 узел - первая буква г, а через тройку я написала название книги на Б, но он пихнул букву Б на первое место

Добавлено через 8 минут
А, я поняла, он просто не от А до Я сортирует, а от Я до А, простите

Добавлено через 58 секунд
А можно как-то это поменять, чтобы от А до Я сортировал?

Добавлено через 1 минуту
Нашла

Добавлено через 1 минуту
А можно как-то сделать сортировку по годам в выводе, когда 4 нажимаешь?

Добавлено через 10 минут
oleg-m1973, Искала как сделать, но что-то я не понимаю, как с этим всем работать через указатели
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.04.2021, 20:53
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
А можно как-то сделать сортировку по годам в выводе, когда 4 нажимаешь?
Добавлено через 10 минут
oleg-m1973, Искала как сделать, но что-то я не понимаю, как с этим всем работать через указатели
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PBook PopFront(PBook &Head)
{
    if (!Head)
        return nullptr;
 
    PBook p = Head;
    Head = Head->next;
    return p;
}
 
void SortByYear(PBook &Head)
{
    PBook Head2 = nullptr;
    while (Head)
        AddAfter(Head2, FindPrevByYear(Head2, Head->year), PopFront(Head)); 
 
    Head = Head2;
}
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
09.04.2021, 20:57  [ТС]
oleg-m1973, FindPrevByYear пишет нет такого идентификатора
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.04.2021, 20:57

Добавить элемент в начало списка
Добавить элемент в начало списка. срочно нужно,помогите пожалуйста

Добавить элементы в начало главного списка
Функция void AddHead(const List *l1) должна добавлять элементы l1 в голову главного списка. Первое добавление проходит нормально, второе...

Добавить элемент в начало двусвязного списка
Как создать функцию AddXBegin, чтобы можно было добавить допустим какое то значение int, без создания новой структуры? Есть конструктор, но...

Удалить элемент с заданным номером и добавить К элементов в начало списка
Написать программу, в которой создаются динамические структуры и выполнить их обработку в соответствии со своим вариантом. Для...

Односвязные списки. Добавить элементы в начало списка. Проверить, состоит ли список только из одного элемента
Здравствуйте, уважаемые форумчане! Придумал несложную задачу на односвязные списки. Надеюсь, кому-то будет интересно. Вот код: /* ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru