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

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

21.02.2013, 00:30. Показов 1466. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
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!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
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!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
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!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
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!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
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!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
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
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru