9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153

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

21.02.2013, 00:30. Показов 1583. Ответов 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);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2013, 00:30
Ответы с готовыми решениями:

Связный список (Используя структуру описания даты, построить связный список студентов, сформированный в алфавитном порядке)
Здраствуйте! Помогите пожалуйста найти косяк. Выводится только первая строчка из списка студентов. Вот такая задачка : Программа...

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

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

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

1) нужно описывать шаблон в заголовочном файле _ПОЛНОСТЬЮ_
2) если компиллятор поддерживает директиву С++ export, то методы шаблона нужно определять как:
#include "xxx.h"
export template <class TYPE> xxx<TYPE>::xxx()
{ ... }
export template <class TYPE> xxx<TYPE>::~xxx()
{ ... }
0
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 00:53  [ТС]
Да, но тут как раз определения функций шаблона происходят в одном файле. Просто каждый класс в своём файле.
0
 Аватар для Iron Acorn
12 / 12 / 2
Регистрация: 28.09.2012
Сообщений: 39
21.02.2013, 00:55
Цитата Сообщение от kebal Посмотреть сообщение
Да, но тут как раз определения функций шаблона происходят в одном файле. Просто каждый класс в своём файле.
Сорри, не заметил. На что компилятор ругается?
0
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 00:57  [ТС]
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 по умолчанию
0
 Аватар для Iron Acorn
12 / 12 / 2
Регистрация: 28.09.2012
Сообщений: 39
21.02.2013, 01:07
Цитата Сообщение от 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
0
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 01:18  [ТС]
Там в файле 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 ошибок.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
21.02.2013, 01:21
Цитата Сообщение от kebal Посмотреть сообщение
C++
1
Spisok *firstPtr;
C++
1
Spisok<NODETYPE> *firstPtr;
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 01:25  [ТС]
gray_fox, да-да, я это как раз исправил в моём предыдущем посте.
Но ошибки всё также вылазят. Неправильно объявлены заголовки мне кажется.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
21.02.2013, 01:34
Цитата Сообщение от 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"
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 02:06  [ТС]
gray_fox, ошибка
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Mi crosoft.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);
    }
}
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
21.02.2013, 02:14
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
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 02:14  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
kebal, ещё раз скажу - предварительно объяви шаблон класса ListSpisok перед определением Spisok.
Я так и сделал, а в предыдущем посте написал какая вылазит ошибка. Да, она вылазила, когда было несколько файлов.
А вот если один, то всё в порядке. Большое спасибо, а можете объяснить зачем нужно его объявлять перед?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
21.02.2013, 02:26
kebal, ну, грубо говоря, компилятор не знает, что есть такой шаблон класса - ListSpisok, поэтому и выражение ListSpisok<NODETYPE> не понимает. Вообще для самого объявления чего-либо другом объявление этого "чего-либо" не нужно. Например можно так:
C++
1
2
3
4
5
6
class A {
   
   // ранее не объявлены
   friend class B;
   friend void foo();
};
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 02:28  [ТС]
Ещё одно решение вместо того, что ты предложил:
Объявить друга так
C++
1
2
template <class NODETYPE>
    friend class ListSpisok;
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
21.02.2013, 02:30
kebal, да, об этом я что-то не подумал...)
0
15 / 15 / 1
Регистрация: 17.10.2012
Сообщений: 98
Записей в блоге: 1
21.02.2013, 02:36
Цитата Сообщение от kebal Посмотреть сообщение
Так вот смотри, ListShipok.h использует Spisok.h для композиции. А Spisok.h объявляет у себя ListSpisok как друга. И вот я не знаю кого где объявлять. Но подключение Spisok.h в ListSpisok.h ничего не даёт, вылазит уже 8 ошибок.
Вот ты говориш про дружествиные методы(фунции)
зделай всё в одном файле и не мучайся с этой пропагандой
там практически всё правильно но можно всё реализовать не через Жопу!
но если ты уж так стоиш на своём то зделай как я тебе говорю
в STL есть уже подготовленый для тебя связный список и двухсвязный...
(они шаблоные) ну и куча кним методы например сортировка по возростанию...
ну если всё с этим не знаком то просто в один файл кинь и Вуаля =)
и советую почитать про STL там куча всякой такой пропаганды написано
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
21.02.2013, 02:53
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;
}
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 10:38  [ТС]
Точняк, спасибо, не подумал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2013, 10:38
Помогаю со студенческими работами здесь

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

Связный список
Скажите, пожалуйста, почему не отображается lastName? Или в структуре можно создавать только один тип для связных списков? #include...

Связный список
Здравствуйте. Имеется структура struct list { CString name,attr,path,date; list* next; }; list* first = NULL;

Связный список
Здравствуйте. Подскажите информацию насчет связных списков. Книгу, или сайтик.

Связный список
node *temp; 1.temp = (node*)malloc(sizeof(node)); 2.temp = new node; 1)Как работает (node*)malloc(sizeof(node)) ? что...


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

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

Новые блоги и статьи
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru