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

Шаблон двунаправленного списка

09.05.2017, 12:56. Показов 2205. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Пишу программу "библиотека", которая включает в себя типы данных Книга и Читатель соответственно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const int MAX_STRING_LENGTH = 30;
 
struct Book {
    int index;
    char author[MAX_STRING_LENGTH];
    char title[MAX_STRING_LENGTH];
    int price;
    int amount;
    char note[MAX_STRING_LENGTH];
};
 
struct Reader {
    int index;
    char surname[MAX_STRING_LENGTH];
    char name[MAX_STRING_LENGTH];
    int group;
    char phone[MAX_STRING_LENGTH];
    char email[MAX_STRING_LENGTH];
    char note[MAX_STRING_LENGTH];
};
При запуске программы данные о книгах и читателях должны считываться из файла в двунаправленные списки. Проблема заключается в создании шаблона списка, который будет подходить к каждой из вышеприведенных структур. Делаю его таким:

C++
1
2
3
4
5
6
template <class T>
struct List{
    T* data;
    List<T>* next;
    List<T>* previous;
};
Далее вызывает ошибки функция вывода элемента списка в консоль:

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
template <class T>
void show(List<T>* head) {
    system("cls");
    if (head == NULL) {
        if (typeid(T) == typeid(Book)) printf("Библиотека не имеет книг");
        else printf("Библиотека не имеет читателей");
        return;
    }
 
    head = moveToStart(head); //перемещение в начало списка
    if (typeid(T) == typeid(Book)) {
        printf("Книги:\n\n");
    }
    else {
        printf("Читатели:\n\n");
    }
 
    while (head->data != NULL) {
        if (typeid(T) == typeid(Book)) {
            showBook(head->data); //вывод информации о книге
        }
        else {
            showReader(head->data);//вывод информации о читателе
        }
        head = head->next;
    }
}
Ошибки следующие: (в VS 2015 код ошибки c2039) "surname",...,"email" не является членом "Book",
а также c2664 "void showReader(Reader*)": невозможно преобразовать аргумент 1 из "Book*" в "Reader*".

Подобная ошибка (Невозможно преобразовать Reader* в Book*) вызывается в функции добавления книг:

C++
1
2
3
4
5
6
7
8
9
10
11
12
List<T>* addNewBooks(List<T>* head, int* amount) {
    system("cls");
    do {
        T* data;                                                                              //Прототипы функций  
        if (typeid(T) == typeid(Book)) data = enteringBook(amount); //Book* enteringBook(int* amount);
        else data = enteringReader(amount);                                    //Reader* enteringReader(int* amount);
 
        head = addToList(data, head);//добавление элемента в список
        printf("\nНажмите любую клавишу для ввода следующей книги.\nНажмите Esc для возврата в меню");
    } while (_getch() != 27);
    return head;
}
В чем причина данных ошибок? Возможно ли вообще полностью реализовать данный шаблонный список, или же ничего не остается, как дублировать функции для двух отдельных списков с полями Book* и Reader*?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2017, 12:56
Ответы с готовыми решениями:

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

Реализация Двунаправленного списка
Ребят, что он хочет от меня, ошибка компиляции, понять не могу в чем проблема, у меня еще просто компилятор не пишет причину ошибки а...

Сортировка двунаправленного списка
Посоветуйте пожалуйста адекватный метод сортировки двунаправленного списка. Я сопсно вычитал на вики, что лучше всего сортировать путем...

3
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
09.05.2017, 16:19
Eg1, список является контейнером, а контейнер не должен знать деталей реализации хранимых в нем объектов.
Так что функции ввода/вывода должны быть вне контейнера.
Основные операции для списков - добавить элемент, удалить элемент, пройтись циклом по элементам.
0
0 / 0 / 0
Регистрация: 09.05.2017
Сообщений: 8
09.05.2017, 20:18  [ТС]
Спасибо за ответ. Но вопрос остается всё равно нерешенным. Дело в том, что мне нужно найти способ, как я смогу эти операции прописать один раз для двух списков, различающихся типом хранимых данных. Есть ли такая возможность в C++? Если есть, хотел бы получить какой-то намек, где это можно изучить.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
09.05.2017, 20:37
Eg1, есть наследование, виртуальные функции, но я думаю, что в вашем случае это не подойдет, так как объекты Book и Reader слишком разные.
Есть шаблонные функции - если немного доработать ваши структуры, то можно будет одной и той же функцией выводить элементы списков.
Но все равно вам нужно будет предоставить отдельную реализацию вывода для каждого типа элемента - от этого никуда не уйти.
+ операция добавления книги ведь может осуществляться только со списком книг. Так же и с "читателями".
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.05.2017, 20:37
Помогаю со студенческими работами здесь

Удаление из двунаправленного списка
Программа компилируется, добавляет элементы в список, но когда доходит до удаления вылетает. #include &lt;iostream&gt; #include...

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

Очередь из двунаправленного списка
Вот мой двусвязный список : struct Num { int number; bool ring; Num *next, *prev; }; class List {

Swap для двунаправленного списка
Поменять просто значения узлов, не интересно. Я запутываюсь с ссылками. элементы могут быть заглавными или последними. struct node ...

Постраничный вывод записей двунаправленного списка
Здравствуйте! Проблема в чём - курсовик, постраничный вывод записей двунаправленного списка, при удалении последнего элемента на...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru