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

Шаблон класса двусвязный список - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перевести с DELPHI в С++ http://www.cyberforum.ru/cpp-beginners/thread318359.html
Кто-нибудь сможет помочь переписать код с delphi на с++? И вообще возможно ли это?
C++ Нормальное Распределение чисел есть программа. вычисляет нормально распределенные два числа методом Бокса — Мюллера, не могу сделать что выводила случайную последовательность а не два числа. помогите плиз! #include <math.h> typedef unsigned long long u64; typedef long long s64; typedef double d64; typedef struct { u64 rec_count; u64 start; http://www.cyberforum.ru/cpp-beginners/thread318357.html
C++ Как изучать С++ ?
Уважаемые участники форума, я тут на досуге - невзначай решил научиться азам С++. Нашел кучу учебников сижу типа читаю. Столкнулся с проблемой - масса ненужной информации и нет систематизации материала. Обычно начинают вешать всякую лапшу на уши о том как вначале ничего не было. потом создали компьютер, юзера, админа, Windows итд итп, а потом бац и сложный материал. Может ли мне кто...
C++ Нахождение кратчайшего пути в неорентированном графе от заданой вершины к заданной
Добрый день. Вот решаю задачку о кратчайщем расстояние между двумя верщинами в неорентированном связном графе без циклов. Заданны такие параметры. (Помещаю их в файл text2.txt) 6 -- количество вершин N 1 2 7 -- Начало, конец, длина 2 3 3 2 4 6 4 5 3 5 6 1 4 -- количество пар вершин M для которых нужно узнать короткое растояние
C++ Массив http://www.cyberforum.ru/cpp-beginners/thread318283.html
Помогите разобраться. Только начал читать про указатели и решил написать простенькую программку :) Она считает кол-во прописных букв и записывает эти буквы в массив. Насчет счетчика всё ясно, но вот как записывать буквы в массив не разобрался. GNU nano 2.2.6 Файл: p209E12.cpp #include <cctype> #include <iostream> using namespace std; main() {
C++ исправить код программы #include<iostream.h> #include<conio.h> #include<stdlib.h> #include<string.h> #include<iomanip.h> float f( float, float, float, float); float pr_chet( float *mas, int k); float sum_f( float *mas,int k); void Vivod_mas(float a,int k); подробнее

Показать сообщение отдельно
Anna Bridman
0 / 0 / 0
Регистрация: 12.06.2011
Сообщений: 7
13.06.2011, 01:03  [ТС]     Шаблон класса двусвязный список
Спасибо огромное, попробую разобраться)))

Добавлено через 2 часа 41 минуту
А как получить доступ к какому-либо элементу списка? Вот что у меня с вашей помощью получилось:
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
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
 
// базовый класс элемента связного списка
// не содержит данных, содержит часть логики
struct NodeBase
{
    NodeBase *prev;             // указатель на предыдущий элемент связного списка
    NodeBase *next;             // указатель на следующий элемент связного списка
                                // при создании объекта класса конструктор по-умолчанию
                                // назначает следующий и предыдущий элемент указывать на себя 
  NodeBase() : prev(this), next(this) {}
                                // при создании с таким констуктором, элемент добавляет сам себя
                                // в связный список, представляя себя предыдущему и следующему элементу
  NodeBase(NodeBase *prev_, NodeBase *next_)
    : prev(prev_), next(next_)
  {                             // назначаются предыдущий и следующий элементы
                                // у предыдущего элемента следующим элементом назначается данный элемент
                                // и у следующего элемента предыдущим элементом назначается данный элемент
    prev->next = next->prev = this;
  }
                                // деструктор. при удалении элемента связного списка, 
                                // элемент убирает сам себя из списка
  virtual ~NodeBase()
  {
    prev->next = next;
    next->prev = prev;
  }
};
 
                                // элемент связного списка, уже содержащий данные.
template <typename ValueType>
struct Node: public NodeBase
{
  ValueType value;              // то значение, которое хранит класс
                                // конструктор подставляет значения и вызывает конструтор предка
  Node(NodeBase *prev_, NodeBase *next_, ValueType value)
    : NodeBase(prev_, next_), value(value) {}
};
 
                                // собственно, шаблон двусвязного списка
template <typename ValueType>
class List
{
  private:
  // базовый эелемент.
  // его поле next указывает на первый элемент списка
  // поле prev указываеты на последний элемент списка
  // если список пуст, next == prev == &base
  NodeBase base;
 public:
                                // конструктору по-умолчанию делать в принципе нечего, он должен быть объявлен
  List() : base() {};
 
  ~List()                       // деструктор удаляет список функцией Clear
  {
    Clear();
  }
                                
  bool Empty()                  // функция проверяет, пустой ли список
  {
                                // список пустой, если базовый элемент указывает сам на себя
    return ((base.next == &base) && (base.prev == &base));
  }
  void Clear()
  {
                                // пока список не пуст
    while (!Empty())
                                // удаляется первый элемент
                                // работу по удалению из списка сделает деструктор класса элемента
      delete base.next;
  }
                                
  void PushBack(const ValueType &value) // добавление элемента в конец списка
  {
                                        // просто создается новый элемент списка,
                                        // всё остальное сделает конструктор класса NodeBase
    new Node<ValueType>(base.prev, &base, value);
  }
                                        // удаление последнего элемента
  void PopBack()
  {
    // удаляется элемент связного списка 
    // (в данном случае последний, но в принципе, сработает с любым)
    // работу по фактическому удалению элемента из списка выполнит деструктор
    // класса NodeBase
    delete base.prev;
  }
  void PrintAll()
  {
    // перебор всех элементов в одном цикле
    for (NodeBase *node = base.next; node != &base; node = node->next)
      // для получения значения элемент списка приводится к типу Node*
      std::cout << static_cast< Node<ValueType>* >(node)->value;
  }
  void search(string par_search)//ф-ция поиска
  {
      Bus *E = A;
      if (A == 0)
          return;
      while(E)
      {
          if (par_search ==  E->number)
          {
              cout<<endl<<A->number 
                  <<"\t"<<A->driver
                  <<"\t"<<A->route
                  <<"\t"<<A->deport
                  <<endl;
              break;
          }
                E = E->next;
      }
  }
};
 
// класс автобуса
struct Bus
{
    int number;
    string driver;
    int route;
    bool deport;
    Bus(int number_, string driver_, int route_, bool deport_) : number(number_), driver(driver_), route(route_),deport(deport_) {}
  // переопределенный оператор для вывода на экран
    
    Bus *A;
 
    friend std::ostream& operator<<(std::ostream &stream, const Bus &bus)
    {
        string dep;
        if(bus.deport)
            dep = "on route";
        else dep = "in deport";
        return stream   << "Bus number: "   << bus.number
                        << ", driver: "     << bus.driver
                        << ", route: "      << bus.route                        
                        << ", locate: "     <<dep
                        << std::endl;
    }
};
 
void main()
{
    List<Bus> a; // список автобусов
    int number;
    int route;
    string driver;
    bool locate;
    int menu = 0;
    while (menu != 6)
    {
        cout<<"1 - Formation bus in deport"<<endl   //Формирование автобусов в парке
            <<"2 - Show spisok"<<endl               //Вывод информации обо всех автобусах 
            <<"3 - Exit bus from deport"<<endl      //вывод автобуса на рейс
            <<"3 - Return bus to deport"<<endl      //возврат автобуса в парк
            <<"4 - Bus in deport"<<endl             //выводит тех кто в парке
            <<"5 - Bus on route"<<endl              //выводит тез кто на маршруте
            <<"6 - Exit"<<endl
            <<"Input number menu: ";
        cin >> menu;
        switch(menu)
        {
                case 1: 
                    {
                        cout<<" number: ";  cin>>number;
                        cout<<" driver: ";  cin>>driver;
                        cout<<" route: ";   cin>>route;
                        cout<<" locate(0 - in deport; 1 - on route): "; cin>>locate;
                        a.PushBack(Bus(number, driver, route, locate));                                 
                    }  break;
 
                case 2:
                    { 
                        a.PrintAll();
                    }  break;
 
                case 3:
                    {
                        
                    }  break;
 
                case 4: 
                    {
                        
                    }  break;
 
                case 5: 
                    {
                        
                    }  break;
 
                case 6:  break;//если введена CV=5, то break и switch(CV)обрывается
 
            default: cout << endl << "Enter right number!\n"; break;//если введена не цифра от 1 до 5, то выводится это сообщение
        }
        _getch();
    }
}
Сомнения только с фунуцией поиска. И как мне потом с найденными автобусами совершать действия(например поменять deport на true или false)? Можете проиллюстрировать, пожалуйста

Добавлено через 12 секунд
А как получить доступ к какому-либо элементу списка? Вот что у меня с вашей помощью получилось:
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
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
 
// базовый класс элемента связного списка
// не содержит данных, содержит часть логики
struct NodeBase
{
    NodeBase *prev;             // указатель на предыдущий элемент связного списка
    NodeBase *next;             // указатель на следующий элемент связного списка
                                // при создании объекта класса конструктор по-умолчанию
                                // назначает следующий и предыдущий элемент указывать на себя 
  NodeBase() : prev(this), next(this) {}
                                // при создании с таким констуктором, элемент добавляет сам себя
                                // в связный список, представляя себя предыдущему и следующему элементу
  NodeBase(NodeBase *prev_, NodeBase *next_)
    : prev(prev_), next(next_)
  {                             // назначаются предыдущий и следующий элементы
                                // у предыдущего элемента следующим элементом назначается данный элемент
                                // и у следующего элемента предыдущим элементом назначается данный элемент
    prev->next = next->prev = this;
  }
                                // деструктор. при удалении элемента связного списка, 
                                // элемент убирает сам себя из списка
  virtual ~NodeBase()
  {
    prev->next = next;
    next->prev = prev;
  }
};
 
                                // элемент связного списка, уже содержащий данные.
template <typename ValueType>
struct Node: public NodeBase
{
  ValueType value;              // то значение, которое хранит класс
                                // конструктор подставляет значения и вызывает конструтор предка
  Node(NodeBase *prev_, NodeBase *next_, ValueType value)
    : NodeBase(prev_, next_), value(value) {}
};
 
                                // собственно, шаблон двусвязного списка
template <typename ValueType>
class List
{
  private:
  // базовый эелемент.
  // его поле next указывает на первый элемент списка
  // поле prev указываеты на последний элемент списка
  // если список пуст, next == prev == &base
  NodeBase base;
 public:
                                // конструктору по-умолчанию делать в принципе нечего, он должен быть объявлен
  List() : base() {};
 
  ~List()                       // деструктор удаляет список функцией Clear
  {
    Clear();
  }
                                
  bool Empty()                  // функция проверяет, пустой ли список
  {
                                // список пустой, если базовый элемент указывает сам на себя
    return ((base.next == &base) && (base.prev == &base));
  }
  void Clear()
  {
                                // пока список не пуст
    while (!Empty())
                                // удаляется первый элемент
                                // работу по удалению из списка сделает деструктор класса элемента
      delete base.next;
  }
                                
  void PushBack(const ValueType &value) // добавление элемента в конец списка
  {
                                        // просто создается новый элемент списка,
                                        // всё остальное сделает конструктор класса NodeBase
    new Node<ValueType>(base.prev, &base, value);
  }
                                        // удаление последнего элемента
  void PopBack()
  {
    // удаляется элемент связного списка 
    // (в данном случае последний, но в принципе, сработает с любым)
    // работу по фактическому удалению элемента из списка выполнит деструктор
    // класса NodeBase
    delete base.prev;
  }
  void PrintAll()
  {
    // перебор всех элементов в одном цикле
    for (NodeBase *node = base.next; node != &base; node = node->next)
      // для получения значения элемент списка приводится к типу Node*
      std::cout << static_cast< Node<ValueType>* >(node)->value;
  }
  void search(string par_search)//ф-ция поиска
  {
      Bus *E = A;
      if (A == 0)
          return;
      while(E)
      {
          if (par_search ==  E->number)
          {
              cout<<endl<<A->number 
                  <<"\t"<<A->driver
                  <<"\t"<<A->route
                  <<"\t"<<A->deport
                  <<endl;
              break;
          }
                E = E->next;
      }
  }
};
 
// класс автобуса
struct Bus
{
    int number;
    string driver;
    int route;
    bool deport;
    Bus(int number_, string driver_, int route_, bool deport_) : number(number_), driver(driver_), route(route_),deport(deport_) {}
  // переопределенный оператор для вывода на экран
    
    Bus *A;
 
    friend std::ostream& operator<<(std::ostream &stream, const Bus &bus)
    {
        string dep;
        if(bus.deport)
            dep = "on route";
        else dep = "in deport";
        return stream   << "Bus number: "   << bus.number
                        << ", driver: "     << bus.driver
                        << ", route: "      << bus.route                        
                        << ", locate: "     <<dep
                        << std::endl;
    }
};
 
void main()
{
    List<Bus> a; // список автобусов
    int number;
    int route;
    string driver;
    bool locate;
    int menu = 0;
    while (menu != 6)
    {
        cout<<"1 - Formation bus in deport"<<endl   //Формирование автобусов в парке
            <<"2 - Show spisok"<<endl               //Вывод информации обо всех автобусах 
            <<"3 - Exit bus from deport"<<endl      //вывод автобуса на рейс
            <<"3 - Return bus to deport"<<endl      //возврат автобуса в парк
            <<"4 - Bus in deport"<<endl             //выводит тех кто в парке
            <<"5 - Bus on route"<<endl              //выводит тез кто на маршруте
            <<"6 - Exit"<<endl
            <<"Input number menu: ";
        cin >> menu;
        switch(menu)
        {
                case 1: 
                    {
                        cout<<" number: ";  cin>>number;
                        cout<<" driver: ";  cin>>driver;
                        cout<<" route: ";   cin>>route;
                        cout<<" locate(0 - in deport; 1 - on route): "; cin>>locate;
                        a.PushBack(Bus(number, driver, route, locate));                                 
                    }  break;
 
                case 2:
                    { 
                        a.PrintAll();
                    }  break;
 
                case 3:
                    {
                        
                    }  break;
 
                case 4: 
                    {
                        
                    }  break;
 
                case 5: 
                    {
                        
                    }  break;
 
                case 6:  break;//если введена CV=5, то break и switch(CV)обрывается
 
            default: cout << endl << "Enter right number!\n"; break;//если введена не цифра от 1 до 5, то выводится это сообщение
        }
        _getch();
    }
}
Сомнения только с фунуцией поиска. И как мне потом с найденными автобусами совершать действия(например поменять deport на true или false)? Можете проиллюстрировать, пожалуйста

Добавлено через 15 секунд
А как получить доступ к какому-либо элементу списка? Вот что у меня с вашей помощью получилось:
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
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
 
// базовый класс элемента связного списка
// не содержит данных, содержит часть логики
struct NodeBase
{
    NodeBase *prev;             // указатель на предыдущий элемент связного списка
    NodeBase *next;             // указатель на следующий элемент связного списка
                                // при создании объекта класса конструктор по-умолчанию
                                // назначает следующий и предыдущий элемент указывать на себя 
  NodeBase() : prev(this), next(this) {}
                                // при создании с таким констуктором, элемент добавляет сам себя
                                // в связный список, представляя себя предыдущему и следующему элементу
  NodeBase(NodeBase *prev_, NodeBase *next_)
    : prev(prev_), next(next_)
  {                             // назначаются предыдущий и следующий элементы
                                // у предыдущего элемента следующим элементом назначается данный элемент
                                // и у следующего элемента предыдущим элементом назначается данный элемент
    prev->next = next->prev = this;
  }
                                // деструктор. при удалении элемента связного списка, 
                                // элемент убирает сам себя из списка
  virtual ~NodeBase()
  {
    prev->next = next;
    next->prev = prev;
  }
};
 
                                // элемент связного списка, уже содержащий данные.
template <typename ValueType>
struct Node: public NodeBase
{
  ValueType value;              // то значение, которое хранит класс
                                // конструктор подставляет значения и вызывает конструтор предка
  Node(NodeBase *prev_, NodeBase *next_, ValueType value)
    : NodeBase(prev_, next_), value(value) {}
};
 
                                // собственно, шаблон двусвязного списка
template <typename ValueType>
class List
{
  private:
  // базовый эелемент.
  // его поле next указывает на первый элемент списка
  // поле prev указываеты на последний элемент списка
  // если список пуст, next == prev == &base
  NodeBase base;
 public:
                                // конструктору по-умолчанию делать в принципе нечего, он должен быть объявлен
  List() : base() {};
 
  ~List()                       // деструктор удаляет список функцией Clear
  {
    Clear();
  }
                                
  bool Empty()                  // функция проверяет, пустой ли список
  {
                                // список пустой, если базовый элемент указывает сам на себя
    return ((base.next == &base) && (base.prev == &base));
  }
  void Clear()
  {
                                // пока список не пуст
    while (!Empty())
                                // удаляется первый элемент
                                // работу по удалению из списка сделает деструктор класса элемента
      delete base.next;
  }
                                
  void PushBack(const ValueType &value) // добавление элемента в конец списка
  {
                                        // просто создается новый элемент списка,
                                        // всё остальное сделает конструктор класса NodeBase
    new Node<ValueType>(base.prev, &base, value);
  }
                                        // удаление последнего элемента
  void PopBack()
  {
    // удаляется элемент связного списка 
    // (в данном случае последний, но в принципе, сработает с любым)
    // работу по фактическому удалению элемента из списка выполнит деструктор
    // класса NodeBase
    delete base.prev;
  }
  void PrintAll()
  {
    // перебор всех элементов в одном цикле
    for (NodeBase *node = base.next; node != &base; node = node->next)
      // для получения значения элемент списка приводится к типу Node*
      std::cout << static_cast< Node<ValueType>* >(node)->value;
  }
  void search(string par_search)//ф-ция поиска
  {
      Bus *E = A;
      if (A == 0)
          return;
      while(E)
      {
          if (par_search ==  E->number)
          {
              cout<<endl<<A->number 
                  <<"\t"<<A->driver
                  <<"\t"<<A->route
                  <<"\t"<<A->deport
                  <<endl;
              break;
          }
                E = E->next;
      }
  }
};
 
// класс автобуса
struct Bus
{
    int number;
    string driver;
    int route;
    bool deport;
    Bus(int number_, string driver_, int route_, bool deport_) : number(number_), driver(driver_), route(route_),deport(deport_) {}
  // переопределенный оператор для вывода на экран
    
    Bus *A;
 
    friend std::ostream& operator<<(std::ostream &stream, const Bus &bus)
    {
        string dep;
        if(bus.deport)
            dep = "on route";
        else dep = "in deport";
        return stream   << "Bus number: "   << bus.number
                        << ", driver: "     << bus.driver
                        << ", route: "      << bus.route                        
                        << ", locate: "     <<dep
                        << std::endl;
    }
};
 
void main()
{
    List<Bus> a; // список автобусов
    int number;
    int route;
    string driver;
    bool locate;
    int menu = 0;
    while (menu != 6)
    {
        cout<<"1 - Formation bus in deport"<<endl   //Формирование автобусов в парке
            <<"2 - Show spisok"<<endl               //Вывод информации обо всех автобусах 
            <<"3 - Exit bus from deport"<<endl      //вывод автобуса на рейс
            <<"3 - Return bus to deport"<<endl      //возврат автобуса в парк
            <<"4 - Bus in deport"<<endl             //выводит тех кто в парке
            <<"5 - Bus on route"<<endl              //выводит тез кто на маршруте
            <<"6 - Exit"<<endl
            <<"Input number menu: ";
        cin >> menu;
        switch(menu)
        {
                case 1: 
                    {
                        cout<<" number: ";  cin>>number;
                        cout<<" driver: ";  cin>>driver;
                        cout<<" route: ";   cin>>route;
                        cout<<" locate(0 - in deport; 1 - on route): "; cin>>locate;
                        a.PushBack(Bus(number, driver, route, locate));                                 
                    }  break;
 
                case 2:
                    { 
                        a.PrintAll();
                    }  break;
 
                case 3:
                    {
                        
                    }  break;
 
                case 4: 
                    {
                        
                    }  break;
 
                case 5: 
                    {
                        
                    }  break;
 
                case 6:  break;//если введена CV=5, то break и switch(CV)обрывается
 
            default: cout << endl << "Enter right number!\n"; break;//если введена не цифра от 1 до 5, то выводится это сообщение
        }
        _getch();
    }
}
Сомнения только с фунуцией поиска. И как мне потом с найденными автобусами совершать действия(например поменять deport на true или false)? Можете проиллюстрировать, пожалуйста

Добавлено через 51 минуту
Ой.. Инет гребет..

Добавлено через 2 минуты
Поиск тех автобусов, что в парке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        void search_in_deport()
        {
            base *E ;
            if (E == 0)
                return;
            while(E)
            {
                if (E->deport ==  false)
                {
                    cout<<endl<<E->number
                    <<"\t"<<E->driver
                    <<"\t"<<E->route
                    <<endl;
                    break;
                }
                E = E->next;
            }
        }
Что не так? Ребят, помогите понять, пожалуйста

Добавлено через 2 минуты
Если подумать, то ошибка должно быть в начале. While по идее правильный. Может я E не так объявляю?
 
Текущее время: 08:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru