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

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

Восстановить пароль Регистрация
 
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 00:30     Связный список #1
Не получается нормально скомпоновать файлы Сделал связный список использую шаблоны класса.
Файл 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++ Связный список
Список: связный список, в котором информация о книгах сортируется по убыванию стоимости. C++
Связный список (Используя структуру описания даты, построить связный список студентов, сформированный в алфавитном порядке) C++
Связанный список. Создать, записать в связный список последовательность слов,обозначающих месяцы года,заданных пользователем C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Iron Acorn
 Аватар для 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
 Аватар для 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
 Аватар для 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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();
};
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 02:28  [ТС]     Связный список #15
Ещё одно решение вместо того, что ты предложил:
Объявить друга так
C++
1
2
template <class NODETYPE>
    friend class ListSpisok;
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
21.02.2013, 02:30     Связный список #16
kebal, да, об этом я что-то не подумал...)
Програмер_80лвл
15 / 15 / 1
Регистрация: 17.10.2012
Сообщений: 96
Записей в блоге: 1
21.02.2013, 02:36     Связный список #17
Цитата Сообщение от kebal Посмотреть сообщение
Так вот смотри, ListShipok.h использует Spisok.h для композиции. А Spisok.h объявляет у себя ListSpisok как друга. И вот я не знаю кого где объявлять. Но подключение Spisok.h в ListSpisok.h ничего не даёт, вылазит уже 8 ошибок.
Вот ты говориш про дружествиные методы(фунции)
зделай всё в одном файле и не мучайся с этой пропагандой
там практически всё правильно но можно всё реализовать не через Жопу!
но если ты уж так стоиш на своём то зделай как я тебе говорю
в STL есть уже подготовленый для тебя связный список и двухсвязный...
(они шаблоные) ну и куча кним методы например сортировка по возростанию...
ну если всё с этим не знаком то просто в один файл кинь и Вуаля =)
и советую почитать про STL там куча всякой такой пропаганды написано
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
21.02.2013, 02:53     Связный список #18
kebal, кстати, для конкатенации списков достаточно будет связать последний элемент первого с первым элементом второго (а указатель на первый элемент второго сделать 0).

Добавлено через 12 минут
Примерно так:
C++
1
2
3
4
5
6
7
8
template<typename T>
void concat(ListSpisok<T> & lhs, ListSpisok<T> & rhs) {
   lhs.last->nextPtr = rhs.first;
   lhs.last          = rhs.last;
   
   rhs.first = 0;
   lhs.last  = 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 10:38     Связный список
Еще ссылки по теме:

C++ Написать программу, реализующую связный список с информацией о студентах и отображающую список в порядке убывания возраста студента
C++ Связный список
C++ Связный список

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

Или воспользуйтесь поиском по форуму:
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 10:38  [ТС]     Связный список #19
Точняк, спасибо, не подумал.
Yandex
Объявления
21.02.2013, 10:38     Связный список
Ответ Создать тему
Опции темы

Текущее время: 07:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru