Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
#1

Связный список - C++

21.02.2013, 00:30. Просмотров 916. Ответов 18
Метки нет (Все метки)

Не получается нормально скомпоновать файлы Сделал связный список использую шаблоны класса.
Файл ListSpisok.h и есть сам связный список. Файл Spisok.h это объекты этого списка. Файл Test.cpp тестирует. Вот я что-то напутал в заголовках, посмотрите их плз. Комбинировал по разному, но не получилось.
Файл Spisok.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
 
template <class NODETYPE>
class Spisok {
    friend class ListSpisok<NODETYPE>;
public:
    Spisok(const NODETYPE &);
    NODETYPE getData() const { return data; }
private:
    Spisok *nextPtr;
    NODETYPE data;
};
 
template <class NODETYPE>
Spisok<NODETYPE>::Spisok(const NODETYPE &ch) {
    data = ch;
    nextPtr = 0;
}
Файл ListSpisok.h
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
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
 
template <class NODETYPE>
class ListSpisok {
public:
    ListSpisok();
    ~ListSpisok();
    void addInTheEnd(const NODETYPE &);
    void addInTheBeginning(const NODETYPE &);
    void removeInTheEnd(NODETYPE &);
    void removeInTheBeginning(NODETYPE &);
    int isEmpty() const;
    void print() const;
private:
    Spisok *firstPtr;
    Spisok *lastPtr;
};
 
template <class NODETYPE>
ListSpisok<NODETYPE>::ListSpisok() { firstPtr = lastPtr = 0; }
 
template <class NODETYPE>
ListSpisok<NODETYPE>::~ListSpisok()
{
    if (! isEmpty()) {
        Spisok *currentPtr = firstPtr, *temp;
        while (currentPtr != 0) {
            temp = currentPtr;
            currentPtr = currentPtr->nextPtr;
            delete temp;
        }
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::addInTheEnd(const NODETYPE &ch)
{
    Spisok *newPtr = new Spisok(ch);
    assert(newPtr != 0);
 
    if (isEmpty())
        firstPtr = lastPtr = newPtr;
    else {
        lastPtr->nextPtr = newPtr;
        lastPtr = newPtr;
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::addInTheBeginning(const NODETYPE &ch)
{
    Spisok *newPtr = new Spisok(ch);
    assert(newPtr != 0);
 
    if (isEmpty())
        firstPtr = lastPtr = newPtr;
    else {
        newPtr->nextPtr = firstPtr;
        firstPtr = newPtr;
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::removeInTheEnd(NODETYPE &ch)
{
    if (isEmpty())
        return;
    else {
        ch = lastPtr->data;
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0;
        else {
            Spisok *currentPtr = firstPtr, *tempPtr = lastPtr;
            while (currentPtr->nextPtr != lastPtr)
                currentPtr = currentPtr->nextPtr;
            lastPtr = currentPtr;
            lastPtr->nextPtr = 0;
            delete tempPtr;
        }
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::removeInTheBeginning(NODETYPE &ch)
{
    if (isEmpty())
        return;
    else {
        Spisok *tempPtr = firstPtr;
 
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0;
        else
            firstPtr = firstPtr->nextPtr;
        ch = tempPtr->data;
        delete tempPtr;
    }
}
 
template <class NODETYPE>
int ListSpisok<NODETYPE>::isEmpty() const { return firstPtr == 0; }
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::print() const
{
    if (! isEmpty()) {
        Spisok *current = firstPtr;
        while (current != 0) {
            cout << current->data << ' ';
            current = current->nextPtr;
        }
    }
}
Файл Test.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
#include "stdafx.h"
#include <iostream>
#include "ListSpisok.h"
#include "Spisok.h"
using namespace std;
 
template <class NODETYPE>
void concatenate(ListSpisok<NODETYPE> &, ListSpisok<NODETYPE> &);
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    ListSpisok<char> first, second;
    char ch;
    first.addInTheEnd('a');
    first.addInTheEnd('b');
    second.addInTheEnd('c');
    second.addInTheEnd('d');
    concatenate(first, second);
    first.print();
 
    system("pause");
    return 0;
}
 
template <class NODETYPE>
void concatenate(ListSpisok<NODETYPE> &first, ListSpisok<NODETYPE> &second) {
    NODETYPE temp;
    while (! second.isEmpty()) {
        second.removeInTheBeginning(temp);
        first.addInTheEnd(temp);
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2013, 00:30     Связный список
Посмотрите здесь:

Обратный связный список - C++
Всем привет! Я уже голову сломал, но никак не могу создать связный список, который помещает новый элемент не в конец списка, а в...

Связный список, удаление - C++
написал программу работы со списком... проблема в удалении элемента по его имени(в процедуре удаления remove подключается процедура...

Четырёх связный список - C++
Доброго всем времени суток. Помогите пожалуйста написать программу на с++ по следующему заданию: Создать класс &quot;Матрица,n,m&quot;, где n и m -...

Связный список объектов - C++
Добрый день, необходимо было реализовать иерархию кадры, администрация, инженер, рабочий и Определить в классе статическую компоненту -...

Наследование и связный список - C++
Пытаюсь сделать связный список, используя наследование при этом. Есть класс Person - имя, и указатель на следующий элемент, операция...

Связный список указателей - C++
Здравствуйте! Может кто нибудь объяснить и разложить по полочкам приведенную ниже программу. Сам чето не врублюсь. Особенно в то, что...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Iron Acorn
12 / 12 / 1
Регистрация: 28.09.2012
Сообщений: 39
21.02.2013, 00:40     Связный список #2
где-то читал, что не все компиляторы смогут скомпилировать, когда используются шаблоны и описание и определение класса в разных файлах.

1) нужно описывать шаблон в заголовочном файле _ПОЛНОСТЬЮ_
2) если компиллятор поддерживает директиву С++ export, то методы шаблона нужно определять как:
#include "xxx.h"
export template <class TYPE> xxx<TYPE>::xxx()
{ ... }
export template <class TYPE> xxx<TYPE>::~xxx()
{ ... }
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 00:53  [ТС]     Связный список #3
Да, но тут как раз определения функций шаблона происходят в одном файле. Просто каждый класс в своём файле.
Iron Acorn
12 / 12 / 1
Регистрация: 28.09.2012
Сообщений: 39
21.02.2013, 00:55     Связный список #4
Цитата Сообщение от kebal Посмотреть сообщение
Да, но тут как раз определения функций шаблона происходят в одном файле. Просто каждый класс в своём файле.
Сорри, не заметил. На что компилятор ругается?
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 00:57  [ТС]     Связный список #5
1>c:\users\admin\documents\visual studio 2012\projects\сцепление связных списков\сцепление связных списков\listspisok.h(18): error C2143: синтаксическая ошибка: отсутствие ";" перед "*"
1> c:\users\admin\documents\visual studio 2012\projects\сцепление связных списков\сцепление связных списков\listspisok.h(20): см. ссылку на создание экземпляров класса шаблон при компиляции "ListSpisok<NODETYPE>"
1>c:\users\admin\documents\visual studio 2012\projects\сцепление связных списков\сцепление связных списков\listspisok.h(18): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\admin\documents\visual studio 2012\projects\сцепление связных списков\сцепление связных списков\listspisok.h(19): error C2143: синтаксическая ошибка: отсутствие ";" перед "*"
1>c:\users\admin\documents\visual studio 2012\projects\сцепление связных списков\сцепление связных списков\listspisok.h(19): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
Iron Acorn
12 / 12 / 1
Регистрация: 28.09.2012
Сообщений: 39
21.02.2013, 01:07     Связный список #6
Цитата Сообщение от kebal Посмотреть сообщение
1>c:\users\admin\documents\visual studio 2012\projects\сцепление связных списков\сцепление связных списков\listspisok.h(18): error C2143: синтаксическая ошибка: отсутствие ";" перед "*"
1> c:\users\admin\documents\visual studio 2012\projects\сцепление связных списков\сцепление связных списков\listspisok.h(20): см. ссылку на создание экземпляров класса шаблон при компиляции "ListSpisok<NODETYPE>"
1>c:\users\admin\documents\visual studio 2012\projects\сцепление связных списков\сцепление связных списков\listspisok.h(18): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>c:\users\admin\documents\visual studio 2012\projects\сцепление связных списков\сцепление связных списков\listspisok.h(19): error C2143: синтаксическая ошибка: отсутствие ";" перед "*"
1>c:\users\admin\documents\visual studio 2012\projects\сцепление связных списков\сцепление связных списков\listspisok.h(19): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
первое, что заметил в ListSpisok.h не подключен Spisok.h
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 01:18  [ТС]     Связный список #7
Там в файле ListSpisok.h несколько ошибок было, я подправил
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
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
 
template <class NODETYPE>
class ListSpisok {
public:
    ListSpisok();
    ~ListSpisok();
    void addInTheEnd(const NODETYPE &);
    void addInTheBeginning(const NODETYPE &);
    void removeInTheEnd(NODETYPE &);
    void removeInTheBeginning(NODETYPE &);
    int isEmpty() const;
    void print() const;
private:
    Spisok<NODETYPE> *firstPtr;
    Spisok<NODETYPE> *lastPtr;
};
 
template <class NODETYPE>
ListSpisok<NODETYPE>::ListSpisok() { firstPtr = lastPtr = 0; }
 
template <class NODETYPE>
ListSpisok<NODETYPE>::~ListSpisok()
{
    if (! isEmpty()) {
        Spisok<NODETYPE> *currentPtr = firstPtr, *temp;
        while (currentPtr != 0) {
            temp = currentPtr;
            currentPtr = currentPtr->nextPtr;
            delete temp;
        }
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::addInTheEnd(const NODETYPE &ch)
{
    Spisok<NODETYPE> *newPtr = new Spisok(ch);
    assert(newPtr != 0);
 
    if (isEmpty())
        firstPtr = lastPtr = newPtr;
    else {
        lastPtr->nextPtr = newPtr;
        lastPtr = newPtr;
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::addInTheBeginning(const NODETYPE &ch)
{
    Spisok<NODETYPE> *newPtr = new Spisok(ch);
    assert(newPtr != 0);
 
    if (isEmpty())
        firstPtr = lastPtr = newPtr;
    else {
        newPtr->nextPtr = firstPtr;
        firstPtr = newPtr;
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::removeInTheEnd(NODETYPE &ch)
{
    if (isEmpty())
        return;
    else {
        ch = lastPtr->data;
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0;
        else {
            Spisok<NODETYPE> *currentPtr = firstPtr, *tempPtr = lastPtr;
            while (currentPtr->nextPtr != lastPtr)
                currentPtr = currentPtr->nextPtr;
            lastPtr = currentPtr;
            lastPtr->nextPtr = 0;
            delete tempPtr;
        }
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::removeInTheBeginning(NODETYPE &ch)
{
    if (isEmpty())
        return;
    else {
        Spisok<NODETYPE> *tempPtr = firstPtr;
 
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0;
        else
            firstPtr = firstPtr->nextPtr;
        ch = tempPtr->data;
        delete tempPtr;
    }
}
 
template <class NODETYPE>
int ListSpisok<NODETYPE>::isEmpty() const { return firstPtr == 0; }
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::print() const
{
    if (! isEmpty()) {
        Spisok<NODETYPE> *current = firstPtr;
        while (current != 0) {
            cout << current->data << ' ';
            current = current->nextPtr;
        }
    }
}
Так вот смотри, ListShipok.h использует Spisok.h для композиции. А Spisok.h объявляет у себя ListSpisok как друга. И вот я не знаю кого где объявлять. Но подключение Spisok.h в ListSpisok.h ничего не даёт, вылазит уже 8 ошибок.
gray_fox
What a waste!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
21.02.2013, 01:21     Связный список #8
Цитата Сообщение от kebal Посмотреть сообщение
C++
1
Spisok *firstPtr;
C++
1
Spisok<NODETYPE> *firstPtr;
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 01:25  [ТС]     Связный список #9
gray_fox, да-да, я это как раз исправил в моём предыдущем посте.
Но ошибки всё также вылазят. Неправильно объявлены заголовки мне кажется.
gray_fox
What a waste!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
21.02.2013, 01:34     Связный список #10
Цитата Сообщение от kebal Посмотреть сообщение
А Spisok.h объявляет у себя ListSpisok как друга.
Можно предварительно объявить ListSpisok в Spisok.h, тогда включение там ListSpisok.h не должно понадобиться.

Добавлено через 5 минут
Т.е. в Spisok.h:
C++
1
2
3
4
5
6
7
8
9
10
template<typename>
class ListSpisok;
 
template<typename NODETYPE>
class Spisok {
 
   friend class ListSpisok<NODETYPE>;
 
   // ...
};
В ListSpisok.h:
C++
1
#include "Spisok.h"
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 02:06  [ТС]     Связный список #11
gray_fox, ошибка
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(1268,5): error MSB6006: "rc.exe" завершилась с кодом 1.
Вот кинул уже опять же ещё исправленное, но в один файл. Не компилируется
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
// СвСп.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <assert.h>
using namespace std;
 
template <class NODETYPE>
class Spisok {
    friend class ListSpisok<NODETYPE>;
public:
    Spisok(const NODETYPE &);
    NODETYPE getData() const { return data; }
private:
    Spisok<NODETYPE> *nextPtr;
    NODETYPE data;
};
 
template <class NODETYPE>
Spisok<NODETYPE>::Spisok(const NODETYPE &ch) {
    data = ch;
    nextPtr = 0;
}
 
template <class NODETYPE>
class ListSpisok {
public:
    ListSpisok();
    ~ListSpisok();
    void addInTheEnd(const NODETYPE &);
    void addInTheBeginning(const NODETYPE &);
    void removeInTheEnd(NODETYPE &);
    void removeInTheBeginning(NODETYPE &);
    int isEmpty() const;
    void print() const;
private:
    Spisok<NODETYPE> *firstPtr;
    Spisok<NODETYPE> *lastPtr;
};
 
template <class NODETYPE>
ListSpisok<NODETYPE>::ListSpisok() { firstPtr = lastPtr = 0; }
 
template <class NODETYPE>
ListSpisok<NODETYPE>::~ListSpisok()
{
    if (! isEmpty()) {
        Spisok<NODETYPE> *currentPtr = firstPtr, *temp;
        while (currentPtr != 0) {
            temp = currentPtr;
            currentPtr = currentPtr->nextPtr;
            delete temp;
        }
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::addInTheEnd(const NODETYPE &ch)
{
    Spisok<NODETYPE> *newPtr = new Spisok<NODETYPE>(ch);
    assert(newPtr != 0);
 
    if (isEmpty())
        firstPtr = lastPtr = newPtr;
    else {
        lastPtr->nextPtr = newPtr;
        lastPtr = newPtr;
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::addInTheBeginning(const NODETYPE &ch)
{
    Spisok<NODETYPE> *newPtr = new Spisok<NODETYPE>(ch);
    assert(newPtr != 0);
 
    if (isEmpty())
        firstPtr = lastPtr = newPtr;
    else {
        newPtr->nextPtr = firstPtr;
        firstPtr = newPtr;
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::removeInTheEnd(NODETYPE &ch)
{
    if (isEmpty())
        return;
    else {
        ch = lastPtr->data;
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0;
        else {
            Spisok<NODETYPE> *currentPtr = firstPtr, *tempPtr = lastPtr;
            while (currentPtr->nextPtr != lastPtr)
                currentPtr = currentPtr->nextPtr;
            lastPtr = currentPtr;
            lastPtr->nextPtr = 0;
            delete tempPtr;
        }
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::removeInTheBeginning(NODETYPE &ch)
{
    if (isEmpty())
        return;
    else {
        Spisok<NODETYPE> *tempPtr = firstPtr;
 
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0;
        else
            firstPtr = firstPtr->nextPtr;
        ch = tempPtr->data;
        delete tempPtr;
    }
}
 
template <class NODETYPE>
int ListSpisok<NODETYPE>::isEmpty() const { return firstPtr == 0; }
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::print() const
{
    if (! isEmpty()) {
        Spisok<NODETYPE> *current = firstPtr;
        while (current != 0) {
            cout << current->data << ' ';
            current = current->nextPtr;
        }
    }
}
 
template <class NODETYPE>
void concatenate(ListSpisok<NODETYPE> &, ListSpisok<NODETYPE> &);
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
   /* ListSpisok<char> first, second;
    char ch;
    first.addInTheEnd('a');
    first.addInTheEnd('b');
    second.addInTheEnd('c');
    second.addInTheEnd('d');
    concatenate(first, second);
    first.print();*/
 
    system("pause");
    return 0;
}
 
template <class NODETYPE>
void concatenate(ListSpisok<NODETYPE> &first, ListSpisok<NODETYPE> &second) {
    NODETYPE temp;
    while (! second.isEmpty()) {
        second.removeInTheBeginning(temp);
        first.addInTheEnd(temp);
    }
}
gray_fox
What a waste!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
21.02.2013, 02:14     Связный список #12
kebal, ещё раз скажу - предварительно объяви шаблон класса ListSpisok перед определением Spisok.

Добавлено через 2 минуты
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
// СвСп.cpp: определяет точку входа для консольного приложения.
//
 
//#include "stdafx.h"
#include <iostream>
//#include <assert.h>
#include <cassert>
 
using namespace std;
 
// -->
template<typename>
class ListSpisok;
// <--
 
template <class NODETYPE>
class Spisok {
    friend class ListSpisok<NODETYPE>;
public:
    Spisok(const NODETYPE &);
    NODETYPE getData() const { return data; }
private:
    Spisok<NODETYPE> *nextPtr;
    NODETYPE data;
};
 
template <class NODETYPE>
Spisok<NODETYPE>::Spisok(const NODETYPE &ch) {
    data = ch;
    nextPtr = 0;
}
 
template <class NODETYPE>
class ListSpisok {
public:
    ListSpisok();
    ~ListSpisok();
    void addInTheEnd(const NODETYPE &);
    void addInTheBeginning(const NODETYPE &);
    void removeInTheEnd(NODETYPE &);
    void removeInTheBeginning(NODETYPE &);
    int isEmpty() const;
    void print() const;
private:
    Spisok<NODETYPE> *firstPtr;
    Spisok<NODETYPE> *lastPtr;
};
 
template <class NODETYPE>
ListSpisok<NODETYPE>::ListSpisok() { firstPtr = lastPtr = 0; }
 
template <class NODETYPE>
ListSpisok<NODETYPE>::~ListSpisok()
{
    if (! isEmpty()) {
        Spisok<NODETYPE> *currentPtr = firstPtr, *temp;
        while (currentPtr != 0) {
            temp = currentPtr;
            currentPtr = currentPtr->nextPtr;
            delete temp;
        }
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::addInTheEnd(const NODETYPE &ch)
{
    Spisok<NODETYPE> *newPtr = new Spisok<NODETYPE>(ch);
    assert(newPtr != 0);
 
    if (isEmpty())
        firstPtr = lastPtr = newPtr;
    else {
        lastPtr->nextPtr = newPtr;
        lastPtr = newPtr;
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::addInTheBeginning(const NODETYPE &ch)
{
    Spisok<NODETYPE> *newPtr = new Spisok<NODETYPE>(ch);
    assert(newPtr != 0);
 
    if (isEmpty())
        firstPtr = lastPtr = newPtr;
    else {
        newPtr->nextPtr = firstPtr;
        firstPtr = newPtr;
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::removeInTheEnd(NODETYPE &ch)
{
    if (isEmpty())
        return;
    else {
        ch = lastPtr->data;
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0;
        else {
            Spisok<NODETYPE> *currentPtr = firstPtr, *tempPtr = lastPtr;
            while (currentPtr->nextPtr != lastPtr)
                currentPtr = currentPtr->nextPtr;
            lastPtr = currentPtr;
            lastPtr->nextPtr = 0;
            delete tempPtr;
        }
    }
}
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::removeInTheBeginning(NODETYPE &ch)
{
    if (isEmpty())
        return;
    else {
        Spisok<NODETYPE> *tempPtr = firstPtr;
 
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0;
        else
            firstPtr = firstPtr->nextPtr;
        ch = tempPtr->data;
        delete tempPtr;
    }
}
 
template <class NODETYPE>
int ListSpisok<NODETYPE>::isEmpty() const { return firstPtr == 0; }
 
template <class NODETYPE>
void ListSpisok<NODETYPE>::print() const
{
    if (! isEmpty()) {
        Spisok<NODETYPE> *current = firstPtr;
        while (current != 0) {
            cout << current->data << ' ';
            current = current->nextPtr;
        }
    }
}
 
template <class NODETYPE>
void concatenate(ListSpisok<NODETYPE> &, ListSpisok<NODETYPE> &);
 
// int _tmain(int argc, _TCHAR* argv[])
int main()
{
   // setlocale(LC_ALL, "Russian");
   /* ListSpisok<char> first, second;
    char ch;
    first.addInTheEnd('a');
    first.addInTheEnd('b');
    second.addInTheEnd('c');
    second.addInTheEnd('d');
    concatenate(first, second);
    first.print();*/
 
    //system("pause");
    return 0;
}
 
template <class NODETYPE>
void concatenate(ListSpisok<NODETYPE> &first, ListSpisok<NODETYPE> &second) {
    NODETYPE temp;
    while (! second.isEmpty()) {
        second.removeInTheBeginning(temp);
        first.addInTheEnd(temp);
    }
}
http://ideone.com/VJ8gle
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 02:14  [ТС]     Связный список #13
Цитата Сообщение от gray_fox Посмотреть сообщение
kebal, ещё раз скажу - предварительно объяви шаблон класса ListSpisok перед определением Spisok.
Я так и сделал, а в предыдущем посте написал какая вылазит ошибка. Да, она вылазила, когда было несколько файлов.
А вот если один, то всё в порядке. Большое спасибо, а можете объяснить зачем нужно его объявлять перед?
gray_fox
What a waste!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
21.02.2013, 02:26     Связный список #14
kebal, ну, грубо говоря, компилятор не знает, что есть такой шаблон класса - ListSpisok, поэтому и выражение ListSpisok<NODETYPE> не понимает. Вообще для самого объявления чего-либо другом объявление этого "чего-либо" не нужно. Например можно так:
C++
1
2
3
4
5
6
class A {
   
   // ранее не объявлены
   friend class B;
   friend void foo();
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 02:28     Связный список
Еще ссылки по теме:

Не удаляется 2-х связный список - C++
Работает все, но сам список не удаляется. Помогите найти проблему. #include &lt;iostream&gt; using namespace std; struct Node { ...

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

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

Стек через связный список - C++
Здравствуйте мне нужно переделать стек через указатели и связный список. #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace...


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

Или воспользуйтесь поиском по форуму:
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 02:28  [ТС]     Связный список #15
Ещё одно решение вместо того, что ты предложил:
Объявить друга так
C++
1
2
template <class NODETYPE>
    friend class ListSpisok;
Yandex
Объявления
21.02.2013, 02:28     Связный список
Ответ Создать тему
Опции темы

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