Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ocean1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 30
#1

Создать шаблонный класс библиотека на основе односвязного списка - C++

23.07.2015, 15:38. Просмотров 400. Ответов 3
Метки нет (Все метки)

мне нужно создать класс библиотека на основе односвязного списка, но список должен быть шаблонным, дело в том, что по заданию нужно реализовывать методы сортировки по фамилиям авторов и по годам издания, получается, что эти методы уже заточены под поля определенной структуры и значит они не могут быть шаблонными. я прав или всё же их можно оформить шаблонно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2015, 15:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создать шаблонный класс библиотека на основе односвязного списка (C++):

Разработать шаблонный класс "дек" на основе односвязного списка - C++
3. Разработать шаблонный класс "дек" на основе односвязного списка. Реализовать операции: - добавить элемент в начало дека - добавить...

Напишите класс «Стек» для целочисленных данных на основе односвязного списка - C++
Напишите класс «Стек» для целочисленных данных на основе односвязного списка. Предусмотрите функции добавления и извлечения элемента,...

Создать шаблонный класс "Элемент списка" - C++
Задание из экзамена. Помогите пожалуйста 1. Создать шаблонный класс "Элемент списка". Инкапсулировать в классе информационное и...

Очередь на основе односвязного списка - C++
Задание: "Реализовать очередь на основе односвязного списка" Вообщем сделал простую очередь, вопрос, как её реализовать с помощью списка?...

Стек на основе односвязного списка (доработать код) - C++
Написать класс "стек" (первый пришел, последний ушел) на основе односвязного списка. Реализовать методы Push и Pop. Стек хранит структуру...

Очередь с приоритетным исключением на основе односвязного списка - C++
Реализовать очередь с приоритетным исключением на основе односвязного списка. Для этого разработать следующие функции: 1. Помещение...

3
Nick Alte
Эксперт С++
1644 / 1016 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
23.07.2015, 15:46 #2
И да, и нет. Методы, заточенные под конкретную структуру, не должны быть шаблонными. Та же история с классом "библиотека" - там шаблонам не место. А вот односвязный список (инстанциация которого для класса "книга" станет составной частью класса "библиотека") может и должен быть шаблонным.
0
hoggy
6803 / 2990 / 515
Регистрация: 15.11.2014
Сообщений: 6,764
Завершенные тесты: 1
23.07.2015, 15:59 #3
Цитата Сообщение от Ocean1 Посмотреть сообщение
получается, что эти методы уже заточены под поля определенной структуры и значит они не могут быть шаблонными. я прав или всё же их можно оформить шаблонно?
получается, что вам нужна сортировка по предикату.

http://rextester.com/XOMTQ42785

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
//Title of this code
//g++  4.9.2
 
#include <iostream>
#include <algorithm> 
 
 
// никто не знает о существовании этой структуры
// я её только что придумал
struct data
{
    int v;
};
 
int main()
{
 
    std::cout << "Hello, world!\n";
 
    //создаем массив таких структур
    data arr[] 
        = {32, 71, 12, 45, 26, 80, 53, 33 };
    
    std::cout << "source: ";
    for(const auto& i: arr)
        std::cout << i.v << ", ";
    std::cout<< '\n';
 
    // создаем предикат
    // он определяет правила, 
    // по которым мы хотим выполнять сортировку
    const auto predicat 
        = [](const data& i, const data& j){ return i.v < j.v; };
 
 
    // функция сортировки понятия не имеет, что это за структура data
    // однако, благодаря предикату, 
    // тем не менее, она может выполнить сортировку
    std::sort( arr, arr + 8, predicat );
 
    // таким образом, единожны описанная шаблоно-функция 
    // благодаря предикатам может сортировать любые данные
    // в том числе такие, о типах которых она ничего не знает
 
 
    std::cout << "sorted: ";
    for(const auto& i: arr)
        std::cout << i.v << ", ";
    std::cout<< '\n';
}
0
Геомеханик
746 / 552 / 383
Регистрация: 26.06.2015
Сообщений: 1,305
23.07.2015, 20:58 #4
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
#include <iostream>
#include <cstring>
 
template<typename T>
struct node {
    T val;
    node<T>* next;
};
 
template<typename T>
class single_list {
private:
    node<T>* head;
    node<T>* tail;
    size_t   cnt;
public:
    single_list(void):head(NULL),
                      tail(NULL), 
                      cnt(0){}
    ~single_list(){
        this->clear();
    }
    single_list(const single_list&);
    single_list& operator = (const single_list&);
public:
    //добавление элемента в конец
    bool add_back(const T& val){
        node<T>* p = new_node(val);
        if(p != NULL){
            if(head == NULL)
                head = tail = p;
            else {
                tail->next = p;
                tail = p;
            }
        }
        return (p != NULL);
    }
 
    //сортировка
    template<typename Cmp>
    void sort(Cmp cmp){
        head = _merge_sort(head, &tail, cmp);
    }
 
    //удаление всех элементов
    void clear(void){
        node<T>* tmp;
        while(head != NULL){
            tmp  = head;
            head = head->next;
            delete tmp;
        }
        tail = NULL;
        cnt  = 0;
    }   
 
    size_t   size(void) const { return cnt; }
    node<T>* begin(void){ return head; }
    node<T>* begin(void) const { return head; }
private:
    node<T>* new_node(const T& val){
        node<T>* p = new (std::nothrow) node<T>();
        if(p != NULL){
            p->val  = val;
            p->next = NULL;
            ++cnt;
        }
        return p;
    }
 
    //сортировкa слиянием
    template<typename Cmp>
    node<T>* _merge_sort(node<T>* lst, node<T>** ptail, Cmp cmp) {
        if((lst == NULL) || (lst->next == NULL))
            return lst;
        node<T>* ptr, *next, *end;
        node<T>* first = lst;
        node<T>* last  = lst;
 
        ptr = next = end = NULL;
        for(node<T>* p = lst; (p != NULL) && (p->next != NULL); p = p->next->next) {
            last  = first;
            first = first->next;
        }
        last->next = NULL;
 
        lst   = _merge_sort(lst,   ptail, cmp);
        first = _merge_sort(first, ptail, cmp);
 
        while((lst != NULL) || (first != NULL)){ 
            if(first == NULL) {
                next = lst;
                lst  = lst->next;
            } else if(lst == NULL){
                next  = first;
                first = first->next;
            } else if(cmp(lst->val, first->val)){
                next = lst;
                lst  = lst->next;
            } else {
                next  = first;
                first = first->next;
            }
 
            if(ptr == NULL)
                ptr = next;
            else
                end->next = next;
            end = next;
        }
        *ptail = end;
        return ptr;
    }
};
 
//----------------------------------------------------------------------------
 
typedef struct {
    char l_name[16];
    int  year;
} book;
 
struct book_cmp {
    bool operator () (const book& a, const book& b)const{
        int res = strcmp(a.l_name, b.l_name);
        return ((res < 0) || (! res && (a.year < b.year)));
    }
};
 
int main(void){
    const size_t N = 8;
    const book arr[N] = {
        {"wwww", 1997}, {"aaaa", 2000}, {"aaaa", 1997}, {"wwww", 1965},
        {"wwww", 1993}, {"cccc", 1997}, {"cccc", 1993}, {"aaaa", 1999}
    };
 
    single_list<book> lst;
    for(size_t i = 0; i < N; ++i)
        lst.add_back(arr[i]);
 
    lst.sort(book_cmp());
    for(const node<book>* p = lst.begin(); p != NULL; p = p->next)
        std::cout << p->val.l_name << ' ' << p->val.year << std::endl;
    lst.clear();
    return 0;
}
Резултат работы кода
0
23.07.2015, 20:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 20:58
Привет! Вот еще темы с ответами:

Алфавитно-частотный словарь на основе односвязного списка с применением токенов - C++
Здравствуйте, дорогие форумчане! Возникла задача создать алфавитно-частотный словарь на основе односвязного списка с применением токенов....

Динамическая структура данных в форме односвязного списка на основе указателей - C++
Не могли вы написать простенький пример программы на языке С++, Delphi или даже псевдокоде, которая реализует алгоритмы основных операций...

Класс односвязного списка структур - C++
сижу ломаю голову над тем, что есть класс односвязного списка стуктур... суть такова: структура данных - односвязный список структур ...

Реализовать класс односвязного списка действительных чисел - C++
Ребят, помогите, пожалуйста, все методы перепробовал, ничего не получилось, одна надежда на Вас! Реализовать класс односвязного списка...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru