Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
1

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

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

Author24 — интернет-сервис помощи студентам
Не получается нормально скомпоновать файлы Сделал связный список использую шаблоны класса.
Файл 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
12 / 12 / 2
Регистрация: 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()
{ ... }
0
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 00:53  [ТС] 3
Да, но тут как раз определения функций шаблона происходят в одном файле. Просто каждый класс в своём файле.
0
12 / 12 / 2
Регистрация: 28.09.2012
Сообщений: 39
21.02.2013, 00:55 4
Цитата Сообщение от kebal Посмотреть сообщение
Да, но тут как раз определения функций шаблона происходят в одном файле. Просто каждый класс в своём файле.
Сорри, не заметил. На что компилятор ругается?
0
9 / 9 / 2
Регистрация: 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 по умолчанию
0
12 / 12 / 2
Регистрация: 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
0
9 / 9 / 2
Регистрация: 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 ошибок.
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
21.02.2013, 01:21 8
Цитата Сообщение от kebal Посмотреть сообщение
C++
1
Spisok *firstPtr;
C++
1
Spisok<NODETYPE> *firstPtr;
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 01:25  [ТС] 9
gray_fox, да-да, я это как раз исправил в моём предыдущем посте.
Но ошибки всё также вылазят. Неправильно объявлены заголовки мне кажется.
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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"
1
9 / 9 / 2
Регистрация: 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);
    }
}
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 02:14  [ТС] 13
Цитата Сообщение от gray_fox Посмотреть сообщение
kebal, ещё раз скажу - предварительно объяви шаблон класса ListSpisok перед определением Spisok.
Я так и сделал, а в предыдущем посте написал какая вылазит ошибка. Да, она вылазила, когда было несколько файлов.
А вот если один, то всё в порядке. Большое спасибо, а можете объяснить зачем нужно его объявлять перед?
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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();
};
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 02:28  [ТС] 15
Ещё одно решение вместо того, что ты предложил:
Объявить друга так
C++
1
2
template <class NODETYPE>
    friend class ListSpisok;
1
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
21.02.2013, 02:30 16
kebal, да, об этом я что-то не подумал...)
0
15 / 15 / 1
Регистрация: 17.10.2012
Сообщений: 98
Записей в блоге: 1
21.02.2013, 02:36 17
Цитата Сообщение от kebal Посмотреть сообщение
Так вот смотри, ListShipok.h использует Spisok.h для композиции. А Spisok.h объявляет у себя ListSpisok как друга. И вот я не знаю кого где объявлять. Но подключение Spisok.h в ListSpisok.h ничего не даёт, вылазит уже 8 ошибок.
Вот ты говориш про дружествиные методы(фунции)
зделай всё в одном файле и не мучайся с этой пропагандой
там практически всё правильно но можно всё реализовать не через Жопу!
но если ты уж так стоиш на своём то зделай как я тебе говорю
в STL есть уже подготовленый для тебя связный список и двухсвязный...
(они шаблоные) ну и куча кним методы например сортировка по возростанию...
ну если всё с этим не знаком то просто в один файл кинь и Вуаля =)
и советую почитать про STL там куча всякой такой пропаганды написано
0
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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;
}
1
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
21.02.2013, 10:38  [ТС] 19
Точняк, спасибо, не подумал.
0
21.02.2013, 10:38
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2013, 10:38
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru