Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
3 / 3 / 2
Регистрация: 05.01.2014
Сообщений: 16
1

Template double linked list C++

13.02.2017, 18:43. Показов 2856. Ответов 3

Пытался реализовать шаблон класса двусвязный список, элементарами которого является класс структура.
1. Как теперь инициализировать класс в main.
2. Не понимаю, для чего нужно явно указывать typename.
3. Можете посмотреть код и указать, где что не так.
Спасибо.


header.hpp:
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
#include <string>
 
#ifndef _doublelinkedlist
#define _doublelinkedlist
 
template <class T> class DoubleLinkedList;
 
template <class T> class Student{
    public:
        struct _data{
            T       __faculty,
                    __name,
                    __bYear,
                    __contract;
        
            _data * _next;
            _data * _prev;
        };
    
        friend class DoubleLinkedList<T>;
};
 
template <class T> class DoubleLinkedList{
    
    protected:
        typename Student<T>::_data      *head,
                                        *curr;
    
    public:
        int len;
  
// constructor.cpp (Status: Ready \ copy)
        DoubleLinkedList();                                             //  Конструктор DLL
        DoubleLinkedList(T anyX);                                       //  Конструктор DLL с параметром
       // DoubleLinkedList(const DoubleLinkedList<T> &cnst);              //  Конструктор DLL с постоянной (Not ready)
        ~DoubleLinkedList();                                            //  Деструктор DLL
    
// pp.cpp (Status: Ready)
        void push(T _data);                                             //  Добавить элемент в DLL
        T pop();                                                        //  Достасть текущий элемент из DLL
 
// out.cpp (Status: Ready)
        void printfMenu();
        T current();                                                    //  Вывести текущий элемент DLL
        void printfList();                                              //  Вывести DLL
 
//  delete.cpp (Status: Ready)
        void removeData(T _data);                                       //  Удалить элемент DLL соответсвующий введенным данным
        void clear();                                                   //  Очистить DLL
        bool checkEmpty();                                              //  Проверить DLL на пустоту
 
//  navigation.cpp (Status: Ready)
        void first();                                                   //  Переместить курсов в начало DLL
        void next();                                                    //  Перейти на следующий элемент DLL
        void prev();                                                    //  Перейти на предыдущий элемент DLL
        void last();                                                    //  Переместить курсов в конец DLL
 
//  sort.cpp (Status: Ready)
        void sort();                                                    //  Отсортировать DLL по возрастанию ??? Решить возрастанию чего
    
};
 
#endif /* header_h */

constructor.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "header.hpp"
 
template <class T> DoubleLinkedList<T>::DoubleLinkedList(){
    head = NULL;
    curr = NULL;
    len  = NULL;
};
 
template <class T> DoubleLinkedList<T>::DoubleLinkedList(T x){
    head = NULL;
    curr = NULL;
    len  =    0;
    
    push(x);
};
 
template <class T> DoubleLinkedList<T>::~DoubleLinkedList(){
    clear();
};


pp.cpp
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
#include "header.hpp"
 
template <class T> void DoubleLinkedList<T>::push(T _data){
    typename Student<T>::_data *pushed;
    pushed = new typename Student<T>::_data;
    pushed->__faculty = _data->__faculty;
    pushed->__name = _data->__name;
    pushed->__bYear = _data->__faculty;
    pushed->__contract = _data->__contract;
    
    if(!checkEmpty()){
        head = pushed;
        curr = pushed;
        curr->_next = pushed;
        curr->_prev = pushed;
    }
    else{
        pushed->_next = curr->_next;
        pushed->_next->_prev = pushed;
        curr->_next = pushed;
        pushed->_prev = curr;
    }
    
    len++;
    
    curr = pushed;
};
 
template <class T> T DoubleLinkedList<T>::pop(){
    T popped;
    
    if(!checkEmpty())
        return 0;
    
    typename Student<T>::_data *tmp = curr;
    popped->__faculty = tmp->__faculty;
    popped->__name = tmp->__name;
    popped->__bYear = tmp->__bYear;
    popped->__contract = tmp->__contract;
    
    if(len == 1){
        head = NULL;
        curr = NULL;
    }
    else{
        curr->_next->_prev = curr->_prev;
        curr->_prev->_next = curr->_next;
        curr = curr->_next;
    }
    
    if(tmp == head)
        head = head->_next;
    
    len--;
    delete tmp;
    return popped;
    
};

navigation.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "header.hpp"
 
template <class T> void DoubleLinkedList<T>::first(){
    curr = head;
};
 
template <class T> void DoubleLinkedList<T>::next(){
    if(checkEmpty())
       curr = curr->_next;
};
 
template <class T> void DoubleLinkedList<T>::prev(){
    if(checkEmpty())
        curr = curr->_prev;
};
 
template <class T> void DoubleLinkedList<T>::last(){
    curr = head;
    
    for(int i = 0; i < len; i++){
        curr = curr->_next;
    }
};

delete.cpp
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
#include "header.hpp"
 
template <class T> bool DoubleLinkedList<T>::checkEmpty(){
    if(curr == NULL)
        return 0;
    else
        return 1;
};
 
template <class T> void DoubleLinkedList<T>::clear(){
    for(int i = 0; i < len; i++){
        pop();
    }
};
 
template <class T> void DoubleLinkedList<T>::removeData(T _data){
    if(checkEmpty()){
        typename Student<T>::_data *tmp = curr;
        
        for(int i = 0; i < len; i++){
            
            if((curr->__faculty == _data->__faculty) && (curr->__name == _data->__name) && (curr->__bYear == _data->__bYear) && (curr->__contract == _data->__contract)){
                
                if(curr == tmp){
                    tmp = tmp->_next;
                    
                    pop();
                }
                
                next();
            }
                
            curr = tmp;
        }
        
    }
};

out.cpp
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
#include "header.hpp"
#include <iostream>
 
template <class T> T DoubleLinkedList<T>::current(){
    if(checkEmpty()){
        std::cout << "Name: " << curr->__name << " | Faculty: " << curr->__faculty << " | Вirthday year: " << curr->__bYear << " | Contract: " << curr->contract << std::endl;
        return curr;
    }
    else{
        std::cout << "Empty: no items to print" << std::endl;
        return 0;
    }
    
};
 
template <class T> void DoubleLinkedList<T>::printfList(){
    if(checkEmpty()){
        typename Student<T>::_data *tmp = head;
        
        for(int i = 0; i < len; i++){
            std::cout << "Name: " << tmp->__name << " | Faculty: " << tmp->__faculty << " | Вirthday year: " << tmp->__bYear << " | Contract: " << tmp->contract << std::endl;
            
            tmp = tmp->_next;
        }
        std::cout << std::endl;
        
    }
    else
        std::cout << "Empty: no items to print" << std::endl;
};

sort.cpp
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
#include "header.hpp"
#include <iostream>
 
 
template <class T> void DoubleLinkedList<T>::sort(){
    T tmp;
    
    for(int i = 0; i < len - 1; i++){
        first();
        
        for(int j = 0; j < len - 1 ; j++){
            if(curr->__name > curr->_next->__name){
                tmp = pop();
                next();
                push(tmp);
            }
            else
                next();
            
        }
    }
    
    std::cout << "Sorted List:" << std::endl;
    printfList();
};
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2017, 18:43
Ответы с готовыми решениями:

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я...

'MyQueue' : use of class template requires template argument list
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки...

C-style Linked List
Итак, изучал я, значит, C-style Linked List (не знаю, как будет по-русски) и столкнулся с такой...

Linked List класс
Ребят! Помогите пожалуйста найти ошибку! Я все написал, но чтобы я не делал выбрасывает с...

3
Любитель чаепитий
3586 / 1686 / 519
Регистрация: 24.08.2014
Сообщений: 5,704
Записей в блоге: 1
13.02.2017, 18:46 2
Лучший ответ Сообщение было отмечено Sandr1x как решение

Решение

https://www.cyberforum.ru/post9488987.html
1
3 / 3 / 2
Регистрация: 05.01.2014
Сообщений: 16
13.02.2017, 19:26  [ТС] 3
Цитата Сообщение от GbaLog- Посмотреть сообщение
Спасибо, даже не подумал об этом.
А если вместо T надо передать структуру?
0
3 / 3 / 2
Регистрация: 05.01.2014
Сообщений: 16
21.02.2017, 13:58  [ТС] 4
UP

не могу понять как инциализировать

C++
1
template DoubleLinkedList<Student>::DoubleLinkedList(typename Student<int> _data);  //ошибка: Explicit instantiation of 'DoubleLinkedList' does not refer to a function template...
Вот сам конструктор:
C++
1
2
3
4
5
6
7
template <template <class> class T> DoubleLinkedList<T>::DoubleLinkedList(T<class _T> _data){
    head = NULL;
    curr = NULL;
    len  =    0;
    
    push(_data);                                                                                    //  Поместить _data в DLL
};
Шаблон в который пытаюсь передать:
C++
1
template <template <class> class T> class DoubleLinkedList{};
Шаблон класса, который пытаюсь передать:
C++
1
template <class _T> class Student
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2017, 13:58

Linked List описание
/*!Begin Snippet:filebegin*/ #ifndef _LINKEDLIST_H_ #define _LINKEDLIST_H_ using namespace...

Проверить программу с linked list
Есть программа, но уверен много недочётов - сам не вижу. Например, правильно ли описаны private...

Связанный список (Linked list).
Добрый день. Вот пишу функцию (в коде название - smash), которая бы из текущего списка создавала 2...

Нужен совет - как сделать circular linked list?
Доброго всем времени суток!!! У меня программа которая считает queue, мне необходимо сделать...


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

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

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