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

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

Войти
Регистрация
Восстановить пароль
 
Anikin
5 / 5 / 4
Регистрация: 20.06.2016
Сообщений: 69
Завершенные тесты: 2
#1

Ошибка в реализации связного списка - C++

11.07.2016, 23:31. Просмотров 186. Ответов 7

Здравствуйте. Делаю заголовочный файл связного списка. В результате компиляции выдает ошибку: "List is not a class template". Не понимаю в чем ошибка, ведь класс List шаблонный.
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
#ifndef LIST_H
#define LIST_H
#include <iostream>
#include <assert.h>
 
using namespace std;
 
//ГЄГ«Г*Г±Г± óçåë Г±ГЇГЁГ±ГЄГ*
template <class NODETYPE>
class ListNode {
    friend class List<NODETYPE>;    //îáúÿâëåГ*ГЁГҐ List äðóæåñòâåГ*Г*ûì ГЄГ«Г*ññîì
    
public:
    ListNode(const NODETYPE& );     //ГЄГ®Г*ñòðóêòîð
    NODETYPE getData() const;       //âîçâðГ*Г№Г*ГҐГІ Г¤Г*Г*Г*ûå óçëГ*
private:
    NODETYPE data;                  //Г¤Г*Г*Г*ûå
    ListNode* nextPtr;              //ñëåäóþùèé óçåë Гў Г±ГЇГЁГ±ГЄГҐ
};
 
//ГЄГ®Г*ñòðóêòîð
template<class NODETYPE>
ListNode<NODETYPE>::ListNode(const NODETYPE& info)
{
    data = info;
    nextPtr = 0;
}
 
//âîçðГ*Г№ГҐГ*ГЁГҐ Г¤Г*Г*Г*ûõ óçëГ*
template<class NODETYPE>
NODETYPE ListNode<NODETYPE>::getData() const { return data; }
 
//ГЄГ«Г*Г±Г± ñïèñîê
template <class NODETYPE>
class List {
public:
    List();         //ГЄГ®Г*ñòðóêòîð
    ~List();        //äåñòðóêòîð
    void insertAtFront(const NODETYPE&);
    void insertAtBack(const NODETYPE&);
    int removeFromFront(NODETYPE&);
    int removeFromBack(NODETYPE&);
    int isEmpty() const;
    void print() const;
private:
    ListNode<NODETYPE>* firstPtr;                   //ГіГЄГ*Г§Г*òåëü Г*Г* Г*Г*Г·Г*ëî Г±ГЇГЁГ±ГЄГ*
    ListNode<NODETYPE>* lastPtr;                    //ГіГЄГ*Г§Г*òåëü Г*Г* ГЄГ®Г*ГҐГ¶
    ListNode<NODETYPE>* getNewNode(const NODETYPE&);    //óòèëèòГ*
};
 
//ГЄГ®Г*ñòðóêòîð Г± óìîë÷Г*Г*ГЁГҐГ¬
template <class NODETYPE> 
List<NODETYPE>::List() { firstPtr = lastPtr = 0;}
 
//äåñòðóêòîð
template <class NODETYPE>
List<NODETYPE>::~List()
{
    if(! isEmpty() ) 
    {       //ñïèñîê Г*ГҐ ïóñòîé
    cout << "ÓäГ*ëåГ*ГЁГҐ óçëîâ...\n";
    
    ListNode<NODETYPE> *currentPtr = firstPtr, *tempPtr;
    
    while (currentPtr != 0) 
        {
        tempPtr = currentPtr;
        cout << tempPtr->data << endl;
        currentPtr = currentPtr->nextPtr;
        delete tempPtr;
        } 
    
    }
 
    cout << "Âñå óçëû ГіГ¤Г*ëåГ*Г»" << endl << endl;
}
 
//äîáГ*ГўГЁГІГј óçåë Гў Г*Г*Г·Г*ëî
template <class NODETYPE>
void List<NODETYPE>::insertAtFront(const NODETYPE& value) 
{
    ListNode<NODETYPE> *newPtr = getNewNode(value);
    
    if (isEmpty())
    firstPtr = lastPtr = newPtr;
    else 
    {
    newPtr->nextPtr = firstPtr;
    firstPtr = lastPtr;
    }
 
}
    
//äîáГ*ГўГЁГІГј óçåë Гў ГЄГ®Г*ГҐГ¶
template <class NODETYPE>
void List<NODETYPE>::insertAtBack(const NODETYPE& value) 
{
    ListNode<NODETYPE> *newPtr = getNewNode(value);
    
    if (isEmpty())
    firstPtr = lastPtr = newPtr;
    else 
    {
    lastPtr->nextPtr = newPtr;
    lastPtr = newPtr;
    }
}
//ГіГ¤Г*ëèòü óçåë Г± Г*Г*Г·Г*Г«Г*
template <class NODETYPE>
int List<NODETYPE>::removeFromFront(NODETYPE& value)
{
    if (isEmpty())      //Г*ГҐГіГ¤Г*Г·Г*îå ГіГ¤Г*ëåГ*ГЁГҐ
    return 0;
    else {
    
        ListNode<NODETYPE>* tempPtr = firstPtr;
        if (firstPtr == lastPtr)
        firstPtr = lastPtr = 0;
        else 
        firstPtr = firstPtr->nextPtr;
        
    value = tempPtr->data;
    delete tempPtr;
    
    return 1;       //ГіГ±ГЇГҐГёГ*îå ГіГ¤Г*ëåГ*ГЁГҐ
    }
}
 
//ГіГ¤Г*ëèòü óçåë Г± ГЄГ®Г*Г¶Г*
template <class NODETYPE>
int List<NODETYPE>::removeFromBack(NODETYPE& value)
{
    if (isEmpty())      //Г*ГҐГіГ¤Г*Г·Г*îå ГіГ¤Г*ëåГ*ГЁГҐ
    return 0;
    else {
    
        ListNode<NODETYPE>* tempPtr = firstPtr;
        if (firstPtr == lastPtr)
        firstPtr = lastPtr = 0;
        else {
        ListNode<NODETYPE>* currentPtr = firstPtr;
        
        while(currentPtr->nextPtr != lastPtr)
        currentPtr = currentPtr->nextPtr;
        
        lastPtr = currentPtr;
        currentPtr->nextPtr = 0;
        }
    value = tempPtr->data;
    delete tempPtr;
    
    return 1;       //ГіГ±ГЇГҐГёГ*îå ГіГ¤Г*ëåГ*ГЁГҐ
    }
 
}
 
//ïóñòîé ëè ñïèñîê 1 - ïóñòîé 0 - Г*ГҐГІ
template <class NODETYPE>
int List<NODETYPE>::isEmpty() const { return firstPtr == 0; }
 
//âîçâðГ*Г№ГҐГ*ГЁГҐ ГіГЄГ*Г§Г*òåëÿ Г*Г* áëèæГ*éøèé óçåë
template <class NODETYPE> 
ListNode<NODETYPE>* List<NODETYPE>::getNewNode(const NODETYPE& value)
{
    ListNode<NODETYPE>* ptr = new ListNode<NODETYPE>(value);
 
    assert(ptr != 0);
    return ptr;
}
 
//print
template <class NODETYPE>
void List<NODETYPE>::print() const 
{
    if (isEmpty() ) {
    cout << "Ñïèñîê ГЇГіГ±ГІ\n\n";
    return;
    }
    
    ListNode<NODETYPE>* currentPtr = firstPtr;
    cout << "Ñïèñîê ñîñòîèò ГЁГ§: ";
    
    while(currentPtr != 0) {
    cout << currentPtr->data << ' ';
    currentPtr = currentPtr->nextPtr;
    } 
    cout << endl << endl;
    
}
#endif
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2016, 23:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в реализации связного списка (C++):

Ошибка в Классе связного списка - C++
Пишу связный список в виде класса, но вот только что заметил, из за удаления элемента ( при его добавлении выделяю под него память...

Ошибка при реализации move конструктора для списка - C++
List(List&amp;&amp;L) { Head = Tail = nullptr; Node*temp = L.Head; Head = temp; L.Head = nullptr; while (L.Head) { ...

сортировка связного списка - C++
Привет всем! пришлите пожалуйста код реализации сортировки односвязного списка (желательно с комментарием)! а то у меня совсем ничего...

Сортировка связного списка - C++
Привет всем! как правильно написать сортировку для связного циклического списка ? помогите пожалуйста... #include &lt;iostream&gt; using...

Создание связного списка - C++
нужно создать связной список, что собственно уже сделал. что нужно: -функции: -root (выводит список) -push (+1 елемент в...

Реализация связного списка - C++
надо решить задачу: Сведения о владельце автомобиля: фамилия, марка автомобиля (строки), номер автомобиля (целое число). По сведениям в...

7
creator_it
1 / 1 / 0
Регистрация: 20.11.2014
Сообщений: 17
12.07.2016, 00:16 #2
11 строка, я так понимаю вы не дописали Mode

Добавлено через 2 минуты
на какую строку указывает компилятор?
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
12.07.2016, 00:19 #3
Цитата Сообщение от Anikin Посмотреть сообщение
friend class List<NODETYPE>;
У вас перед "упоминаем" класса нету его определения. Если класс List<NODETYPE> действительно реализован, то перед

C++
1
template <class NODETYPE>
поставьте

C++
1
2
template <class NODETYPE>
class List<NODETYPE>;
0
Anikin
5 / 5 / 4
Регистрация: 20.06.2016
Сообщений: 69
Завершенные тесты: 2
12.07.2016, 00:57  [ТС] #4
В каком именно месте?
Напишите, пожалуйста, строку целиком.
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
12.07.2016, 01:04 #5
Anikin,

C++
1
2
3
4
5
6
7
8
using namespace std;
 
template <class NODETYPE>
class List<NODETYPE>;
 
//ГЄГ«Г*Г±Г± óçåë Г±ГЇГЁГ±ГЄГ*
template <class NODETYPE>
class ListNode ...
0
Anikin
5 / 5 / 4
Регистрация: 20.06.2016
Сообщений: 69
Завершенные тесты: 2
12.07.2016, 01:10  [ТС] #6
Не помогло, теперь выдает ошибку на 4 строке вашего кода.
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
12.07.2016, 01:30 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Anikin, действительно. Тогда я пока затрудняюсь ответить. Если вам надо срочно, то предлагаю сделать класс ListNode вложенным.

Добавлено через 3 минуты
Anikin, ой, глупая ошибка... Сделайте так

C++
1
2
3
4
5
6
7
8
using namespace std;
 
template <typename NODETYPE>
class List;
 
//ГЄГ«Г*Г±Г± óçåë Г±ГЇГЁГ±ГЄГ*
template <class NODETYPE>
class ListNode ...
1
Anikin
5 / 5 / 4
Регистрация: 20.06.2016
Сообщений: 69
Завершенные тесты: 2
12.07.2016, 01:32  [ТС] #8
Спасибо за помощь!
0
12.07.2016, 01:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2016, 01:32
Привет! Вот еще темы с ответами:

Реализация связного списка - C++
Помогите решить задачу Нужно написать программу без использования библиотеки list я вот начал, только функция добавления не...

Доступ к элементам связного списка - C++
как организовать самый простой для реализации способ чтобы получить доступ к i-му элементу в односвязном списке? придумал только создать...

Конструктор-копирования связного списка - C++
Подскажите,как реализовать конструктор копирования для этого списка class part { public: ...

Вывод связного списка в файл - C++
Пишу программу для манипуляций со связным списком #include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; ...


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

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

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