1 / 1 / 0
Регистрация: 14.11.2013
Сообщений: 77
1

Создать шаблон динамического списка

09.11.2014, 20:01. Показов 2583. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
спроектировать шаблон для класса динамический список
Создать конструкторы: по умолчанию, с параметрами и копирования и продемонстрировать работу с ним.
Деструктор.
функции:
вставка элемента из головы (хвоста) в заданном месте;
вывода списка на экран;
поиск элемента списка;
очистки списка;

Попыталась что-то но совсем не то что нужно.... Читаю лекции и теорию, но в голову не лезет.
Как вообще должен выглядеть шаблон класса динамический список? И как в нем должна реализоваться функция вставки элемента?


C++ (Qt)
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
#include "stdafx.h"
 
#include <iostream>
#include <conio.h>
#include <string>
 
using namespace std;
 
template <class T>
class TList
{
private:
    class TElement
    {
    public:
        T data_;
        TElement * next_;
        TElement(T Data, TElement * Next) : data_(Data), next_(Next) {};
        TElement * Next(void) const { return next_; }
        void setNext(const TElement * Next) { next_ = Next; }
    TList(void);
    ~TList(void);
    void push_front(T el);
    void del_front(void);
    };
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2014, 20:01
Ответы с готовыми решениями:

Реализовать шаблон класса для хранения динамического списка
Нужно реализовать: 1.Операции вставки элемента в начало списка 2.Операцию удаления первого...

Как создать шаблон класса одномерного динамического массива?
Нужно решить задачу(консольное приложение(совместимое с visual studio 2005)): Со-здать ша-блон...

Шаблон динамического массива
//=================================================================================================...

Шаблон задаваемого с клавиатуры динамического массива
Обязательно с использованием классов Есть задача. Дан массив вещественных чисел. а) Ко всем...

15
1 / 1 / 0
Регистрация: 14.11.2013
Сообщений: 77
15.11.2014, 18:14  [ТС] 2
Я попробовала сначала создать класс односвязного динамического списка, а потом переделать его в шаблон (so dumb)

Но, мне кажется, что это какой-то НЕДОшаблон, а может и вовсе не он. Не совсем понимаю, что нужно сделать с классом Node.

C++ (Qt)
1
2
3
4
5
6
7
class Node
{
public:
    int elem;
    Node* next;
    Node();
};
Вот весь текст. Очень надеюсь на помощь. Подскажите, пожалуйста, что не так. Программа-то работает, но вот шаблон ли это?!

C++ (Qt)
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
 
using namespace std;
 
class Node
{
public:
    int elem;
    Node* next;
    Node();
};
Node::Node()
{
    next=0;elem=0;
}
template <typename T>
class List
{
public:
    Node* head;
    Node* tail;
    List();
    ~List();
    void push_back(int val);
    void push_front(int val);
    void insert(int val);
    void print();
    void erase(int val);
    void erase();
    void find(int val);
    void deleteall();
};
 
template <typename T>
List<T>::List()
{
    head=0;
    tail=0;
}
 
template <typename T>
List<T>::~List()
{
    if(head!=NULL)
        {
            delete head;
    delete tail;
    }
}
 
template <typename T>
void List<T>::push_back(int val)
{
    Node* Temp;
    Temp= new Node;
    Temp->elem=val;
    if(head==0)
    {
        head=Temp;
        tail=Temp;
        return;
    }
    tail->next=Temp;
    tail=Temp;
}
 
template <typename T>
void List<T>::push_front(int val)
{
    Node* Temp;
    Temp=new Node;
    Temp->elem=val;
    Temp->next=head;
    head=Temp;
}
 
template <typename T>
void List<T>::insert(int val)
{
    if(head==0)
    {
        push_front(val);
        return;
    }
    Node* Temp;
    Temp=new Node;
    Temp->elem=val;
    Node* founded=head;
    for(founded; founded!=0;founded=founded->next)
    {
        if(founded->elem<val)
            break;
    }
    if(founded==0)
    {
        push_front(val);
        return;
    }
    Temp->next=founded->next;
    founded->next=Temp;
}
 
template <typename T>
void List<T>::print()
{
    if(head==0)
    {
        cout<<"Список пуст";
        return;
    }
    
    cout<<"\n Список:";
    for(Node* ptr=head;ptr!=0;ptr=ptr->next)
    {
        cout<<ptr->elem<<" ";
    }
    cout<<"\n";
}
 
template <typename T>
void List<T>::find(int val)
{
    if(head==0)
    {
        cout<<"Список пуст";
    }
    Node* ptr=head;
    for(ptr;ptr!=0;ptr=ptr->next)
    {
        if(ptr->elem==val)
        {
            cout<<" Элемент "<<val<<" найден в списке\n";
            return;
        }
            
    }
    cout<<" Элемента "<<val<<" нет в списке\n";
}
 
template <typename T>
void List<T>::erase(int val)
{
    if(head==0)
    {
        cout<<"Список пуст";
    }
    Node* ptr=head;
    Node* ptrPrev;
    ptrPrev=new Node;
    for(ptr;ptr!=0;ptr=ptr->next)
    {
        if(ptr->elem==val)
        {
            ptrPrev->next=ptr->next;
            delete ptr;
            break;
        }
        ptrPrev=ptr;
    }
    if(ptrPrev->next==0)
    cout<<"Элемент не найдено\n";
}
 
template <typename T>
void List<T>::erase()
{
    if(head==0)
    {
        cout<<"Список пуст";
    }
    Node *delptr=head;
    head=head->next;
    delete delptr;
}
 
template <typename T>
void List<T>::deleteall()
{
    while(head!=NULL)
        erase();
}
int main()
{
    setlocale(LC_ALL, "Russian");
    List<int> Lst;
    Lst.push_back(5);
    Lst.push_back(10);
    Lst.push_back(15);
    Lst.push_front(1);
    Lst.push_front(25);
    Lst.print();
    
    int l;
    cout<<"\nВведите элемент списка";
    cin>>l;
    Lst.insert(l);
    Lst.print();
 
    cout<<"\nВведите элемент для поиска: ";
    cin>>l;
    Lst.find(l);
 
    cout<<"\nВведите элемент списка, который нужно удалить: ";
    cin>>l;
    Lst.erase(l);
    Lst.print();
 
    Lst.deleteall();
    Lst.print();
 
    getch();
    return 0;
}
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
15.11.2014, 18:26 3
Цитата Сообщение от AlexHolmes Посмотреть сообщение
но вот шаблон ли это?!
Ваш узел хранит только инт, а должен хранить всё что угодно включая польз классы
0
1 / 1 / 0
Регистрация: 14.11.2013
Сообщений: 77
15.11.2014, 19:24  [ТС] 4
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Ваш узел хранит только инт, а должен хранить всё что угодно включая польз классы
Я так и подозревала. А не подскажите как это исправить, пожалуйста?
Тоже прописать там template <typename T>?

Добавлено через 8 минут
Вот так? Или это бред?

C++ (Qt)
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
 
using namespace std;
 
template <typename T> class Node
{
public:
    T elem;
    Node* next;
    Node();
};
 
template <typename T>
Node<T>::Node()
{
    next=0;elem=0;
}
 
template <typename T>
class List
{
public:
    Node<T>* head;
    Node<T>* tail;
    List();
    ~List();
    void push_back(int val);
    void push_front(int val);
    void insert(int val);
    void print();
    void erase(int val);
    void erase();
    void find(int val);
    void deleteall();
};
 
template <typename T>
List<T>::List()
{
    head=0;
    tail=0;
}
 
template <typename T>
List<T>::~List()
{
    if(head!=NULL)
        {
            delete head;
    delete tail;
    }
}
 
template <typename T>
void List<T>::push_back(int val)
{
    Node<T>* Temp;
    Temp= new Node<T>;
    Temp->elem=val;
    if(head==0)
    {
        head=Temp;
        tail=Temp;
        return;
    }
    tail->next=Temp;
    tail=Temp;
}
 
template <typename T>
void List<T>::push_front(int val)
{
    Node<T>* Temp;
    Temp=new Node<T>;
    Temp->elem=val;
    Temp->next=head;
    head=Temp;
}
 
template <typename T>
void List<T>::insert(int val)
{
    if(head==0)
    {
        push_front(val);
        return;
    }
    Node<T>* Temp;
    Temp=new Node<T>;
    Temp->elem=val;
    Node<T>* founded=head;
    for(founded; founded!=0;founded=founded->next)
    {
        if(founded->elem<val)
            break;
    }
    if(founded==0)
    {
        push_front(val);
        return;
    }
    Temp->next=founded->next;
    founded->next=Temp;
}
 
template <typename T>
void List<T>::print()
{
    if(head==0)
    {
        cout<<"Список пуст";
        return;
    }
    
    cout<<"\n Список:";
    for(Node<T>* ptr=head;ptr!=0;ptr=ptr->next)
    {
        cout<<ptr->elem<<" ";
    }
    cout<<"\n";
}
 
template <typename T>
void List<T>::find(int val)
{
    if(head==0)
    {
        cout<<"Список пуст";
    }
    Node<T>* ptr=head;
    for(ptr;ptr!=0;ptr=ptr->next)
    {
        if(ptr->elem==val)
        {
            cout<<" Элемент "<<val<<" найден в списке\n";
            return;
        }
            
    }
    cout<<" Элемента "<<val<<" нет в списке\n";
}
 
template <typename T>
void List<T>::erase(int val)
{
    if(head==0)
    {
        cout<<"Список пуст";
    }
    Node<T>* ptr=head;
    Node<T>* ptrPrev;
    ptrPrev=new Node<T>;
    for(ptr;ptr!=0;ptr=ptr->next)
    {
        if(ptr->elem==val)
        {
            ptrPrev->next=ptr->next;
            delete ptr;
            break;
        }
        ptrPrev=ptr;
    }
    if(ptrPrev->next==0)
    cout<<"Элемент не найдено\n";
}
 
template <typename T>
void List<T>::erase()
{
    if(head==0)
    {
        cout<<"Список пуст";
    }
    Node<T> *delptr=head;
    head=head->next;
    delete delptr;
}
 
template <typename T>
void List<T>::deleteall()
{
    while(head!=NULL)
        erase();
}
int main()
{
    setlocale(LC_ALL, "Russian");
    List<int> Lst;
    Lst.push_back(5);
    Lst.push_back(10);
    Lst.push_back(15);
    Lst.push_front(1);
    Lst.push_front(25);
    Lst.print();
    
    int l;
    cout<<"\nВведите элемент списка";
    cin>>l;
    Lst.insert(l);
    Lst.print();
 
    cout<<"\nВведите элемент для поиска: ";
    cin>>l;
    Lst.find(l);
 
    cout<<"\nВведите элемент списка, который нужно удалить: ";
    cin>>l;
    Lst.erase(l);
    Lst.print();
 
    Lst.deleteall();
    Lst.print();
 
    getch();
    return 0;
}
Добавлено через 39 минут
Кажется, поняла.
Так? Пожалуйста, проверьте)

C++ (Qt)
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
 
using namespace std;
 
template <typename T> class Node
{
public:
    T elem;
    Node<T>* next;
    Node();
};
 
template <typename T>
Node<T>::Node()
{
    next=0;elem=0;
}
 
template <typename T>
class List
{
public:
    Node<T>* head;
    Node<T>* tail;
    List();
    ~List();
    void push_back(T val);
    void push_front(T val);
    void insert(T val);
    void print();
    void erase(T val);
    void erase();
    void find(T val);
    void deleteall();
};
 
template <typename T>
List<T>::List()
{
    head=0;
    tail=0;
}
 
template <typename T>
List<T>::~List()
{
    if(head!=NULL)
        {
            delete head;
    delete tail;
    }
}
 
template <typename T>
void List<T>::push_back(T val)
{
    Node<T>* Temp;
    Temp= new Node<T>;
    Temp->elem=val;
    if(head==0)
    {
        head=Temp;
        tail=Temp;
        return;
    }
    tail->next=Temp;
    tail=Temp;
}
 
template <typename T>
void List<T>::push_front(T val)
{
    Node<T>* Temp;
    Temp=new Node<T>;
    Temp->elem=val;
    Temp->next=head;
    head=Temp;
}
 
template <typename T>
void List<T>::insert(T val)
{
    if(head==0)
    {
        push_front(val);
        return;
    }
    Node<T>* Temp;
    Temp=new Node<T>;
    Temp->elem=val;
    Node<T>* founded=head;
    for(founded; founded!=0;founded=founded->next)
    {
        if(founded->elem<val)
            break;
    }
    if(founded==0)
    {
        push_front(val);
        return;
    }
    Temp->next=founded->next;
    founded->next=Temp;
}
 
template <typename T>
void List<T>::print()
{
    if(head==0)
    {
        cout<<"\nСписок пуст";
        return;
    }
    
    cout<<"Список:";
    for(Node<T>* ptr=head;ptr!=0;ptr=ptr->next)
    {
        cout<<ptr->elem<<" ";
    }
    cout<<"\n";
}
 
template <typename T>
void List<T>::find(T val)
{
    if(head==0)
    {
        cout<<"\nСписок пуст";
    }
    Node<T>* ptr=head;
    for(ptr;ptr!=0;ptr=ptr->next)
    {
        if(ptr->elem==val)
        {
            cout<<"\n Элемент "<<val<<" найден в списке\n";
            return;
        }
            
    }
    cout<<"\n Элемента "<<val<<" нет в списке\n";
}
 
template <typename T>
void List<T>::erase(T val)
{
    if(head==0)
    {
        cout<<"\nСписок пуст";
    }
    Node<T>* ptr=head;
    Node<T>* ptrPrev;
    ptrPrev=new Node<T>;
    for(ptr;ptr!=0;ptr=ptr->next)
    {
        if(ptr->elem==val)
        {
            ptrPrev->next=ptr->next;
            delete ptr;
            break;
        }
        ptrPrev=ptr;
    }
    if(ptrPrev->next==0)
    cout<<"\nЭлемент не найдено\n";
}
 
template <typename T>
void List<T>::erase()
{
    if(head==0)
    {
        cout<<"\nСписок пуст";
    }
    Node<T> *delptr=head;
    head=head->next;
    delete delptr;
}
 
template <typename T>
void List<T>::deleteall()
{
    while(head!=NULL)
        erase();
}
int main()
{
    setlocale(LC_ALL, "Russian");
    List<int> Lst;
    Lst.push_back(5);
    Lst.push_back(10);
    Lst.push_back(15);
    Lst.push_front(1);
    Lst.push_front(25);
    Lst.print();
    
    int l;
    cout<<"\nВведите элемент списка ";
    cin>>l;
    Lst.insert(l);
    Lst.print();
 
    cout<<"\nВведите элемент для поиска: ";
    cin>>l;
    Lst.find(l);
 
    cout<<"\nВведите элемент списка, который нужно удалить: ";
    cin>>l;
    Lst.erase(l);
    Lst.print();
 
    Lst.deleteall();
    Lst.print();
 
    getch();
    return 0;
}
То есть в этом промежутке

C++ (Qt)
1
2
3
4
5
6
7
8
9
List<int> Lst;
    Lst.push_back(5);
    Lst.push_back(10);
    Lst.push_back(15);
    Lst.push_front(1);
    Lst.push_front(25);
    Lst.print();
    
    int l;
я могу инт менять на любой тип, так? Я проверяла с float, char, ну только для string коряво пашет.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
15.11.2014, 19:38 5
кажись так)
0
1 / 1 / 0
Регистрация: 14.11.2013
Сообщений: 77
15.11.2014, 19:44  [ТС] 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
кажись так)
Фух, спасибо)) Главное - разобралась в сути самих шаблонов))
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
15.11.2014, 19:47 7
Цитата Сообщение от AlexHolmes Посмотреть сообщение
template <typename T>
List<T>::~List()
{
* * if(head!=NULL)
* * * * {
* * * * * * delete head;
* * delete tail;
* * }
}
Если в списке 40 элемментов - удаляете первый и сороковый?) Умно) Но утечка)) в 38 эл
1
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
15.11.2014, 19:51 8
AlexHolmes,
C++
1
2
3
4
template <typename T> 
Node<T>::Node()
    : next(0), elem()
{ }
Иначе будет ошибка на типах, которым нельзя присваивать число. Например на строках.
1
1 / 1 / 0
Регистрация: 14.11.2013
Сообщений: 77
15.11.2014, 19:53  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Иначе будет ошибка на типах, которым нельзя присваивать число. Например на строках.
Спасибо)) потому у меня со строками и были проблемы.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
15.11.2014, 20:00 10
del
0
1 / 1 / 0
Регистрация: 14.11.2013
Сообщений: 77
15.11.2014, 20:01  [ТС] 11
Цитата Сообщение от Renji Посмотреть сообщение
"next=0;elem=0;" сглючит если elem нельзя присваивать число (это std::map, например). Просто не инициализируйте его, пусть работает конструктор по умолчанию.
Спасибо, уже исправила))
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
15.11.2014, 20:10 12
Цитата Сообщение от AlexHolmes Посмотреть сообщение
Спасибо, уже исправила))
Только вот вообще не инициализировать не надо (надо инициализировать как в моем примере). Иначе у значений POD-типов (int, double и т.д.) начальное значение будет неопределенным.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
15.11.2014, 20:13 13
А еще лучше: запретить создавать Node конструктором по умолчанию. При создание узла в него уже надо передать значение, что он должен хранить. Зачем пустой узел?)
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
15.11.2014, 20:26 14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Зачем пустой узел?)
Не пустой, а со значением по-умолчанию. Понадобиться это может, например, при реализации метода resize.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
15.11.2014, 20:29 15
Цитата Сообщение от DrOffset Посмотреть сообщение
при реализации метода resize
Напомните, пожалуйста, что делает метод resize в списке???
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
15.11.2014, 20:30 16
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Напомните, пожалуйста, что делает метод resize в списке???
Тут
1
15.11.2014, 20:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2014, 20:30
Помогаю со студенческими работами здесь

Реализовать шаблон динамического числового массива фиксированной длины
Реализовать динамический числовой массив фиксированной длины как класс шаблон. Класс должен иметь...

Сортировка динамического линейного списка
Подскажите пожалуйста как вывести список книг изданных после указанного года.Я уже все пересмотрела...

Поместить в стек из динамического списка
У меня такая задача: Последовательность вещественных чисел сохранить в динамическом списке....

Структура в виде динамического списка
Доброе время суток. Есть программа #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;locale.h&gt;...

Обмен элементов динамического списка
Народ помогите кто как может или литературы полезной скиньте, что то читал читал, а толку нету. ...

Не выводится содержимое динамического списка
доброго времени суток. структура с типом стринг, трем элементам структуры присваивается значение...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru