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

Необходимо создать список, элемент которого может быть список - C++

Восстановить пароль Регистрация
 
Sgushenka
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 9
04.02.2014, 14:54     Необходимо создать список, элемент которого может быть список #1
Всем доброго времени суток! Стоит следующая задача: необходимо создать список, элемент которого может быть список (да да, звучит парадоксально). Вот пример моего кода. В нём достаточно показать как это сделать на самом первом class List node
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
203
204
// Объявление шаблона односвязного списка
#include <cassert>
#include <iostream>
using namespace std;
// Объявление шаблона списка
template <class T>
 
class List{
 
     private:
        // описание элемента списка
        class List_node {
 
                friend class List<T>;
 
                // Создать List_node с осмысленным значением.
                List_node(T node_val): val(node_val) {}
 
                // Создать пустой List_node.
                List_node(){}
 
                ~List_node(){}
                // Напечатать значение.
                void print_val() const{cout << val << " ";}
                
                List_node *next;  //Указывает на следующий List_node.
                T val; // Данные.
                };
 
          List_node *head;        // Указывает на начало списка.
          List_node *tail;        // Указывает на запредельный узел.
          List_node *current;     // Указывает на текущий узел.
 
          // Объявленные закрытыми и не определенные операции копирования
          // и присваивания, что делает их недоступными
          List & operator=(const List &);
          List(const List &);
 
          // Вспомогательная функция, вызываемая из List_node(T),
          // add_front(T) и add_rear(T).
 
          void add_to_empty(T node_val) {
                List_node *node_to_add = new List_node(node_val);
                node_to_add->next = head;
                head = node_to_add;
                tail->next = head;
                current = head;
                }
      public:
 
      // Создать пустой список
      List(){
        head = tail = new List_node;
        tail->next = 0;
        current = tail;
        }
 
      // Создать список, содержащий один элемент
      List(T node_val){
        head = tail = new List_node;
        tail->next = 0;
        add_to_empty(node_val);
      }
 
      // Пройти по списку от начала к концу, удаляя каждый элемент
      ~List() {
 
        List_node *node_to_delete = head;
        for (List_node *sn = head; sn != tail;) {
                sn = sn->next;
                delete node_to_delete;
                node_to_delete = sn;
        }
 
        // assert( node_to_delete == tail);
        delete node_to_delete;
      }
      bool is_empty() const {return head == tail;}
 
      // Ввести новый элемент в начало списка.
      // Отметьте особый случай пустого списка, когда tail->next
      //  равно 0 и потому tail->next не имеет смысла.
 
      void add_front (T node_val) {
        if (is_empty())
                add_to_empty(node_val);
        else {
                List_node *node_to_add = new List_node (node_val);
                node_to_add->next = head;
                head = node_to_add;
        }
      }
 
      // Добавить новый элемент в конец списка.
      // Отметьте специальный случай пустого списка, когда tail->next
      // равно 0 и потому tail->next->next не имеет смысла.
 
      void add_rear(T node_val) {
        if (is_empty())
                add_to_empty(node_val);
        else {
                List_node *node_to_add = new List_node(node_val);
                node_to_add->next = tail;
                tail->next->next  = node_to_add;
                tail->next        = node_to_add;
              }
        }
 
        // Удалить начальный элемент списка.
        // Заметьте, что remove_front() освобождает занимаемую
        // удаляемым элементом память, и потому должна правильно
        // обрабатывать пустые списки. В противном случае она может
        // удалить List_node, который удаляться не должен.
 
        T remove_front() {
                if (is_empty()) throw "tried to remove from an empty list";
 
                List_node *node_to_remove = head;
                T return_val = node_to_remove->val;
                head = node_to_remove->next;
 
                // Помимо конструкторов и вставки в пустой список, это единственное
                // место, где изменяется current (в качестве побочного эффекта).
                if (current == node_to_remove) current = node_to_remove->next;
 
                delete node_to_remove;
                return return_val;
        }
 
        // Возвращает true, если список содержит node_val
        // и false в противном случае.
        bool find(T node_val) const {
            for(List node *sn = head; sn != tail; sn = sn->next) {
                if(sn->val == node_val) return true;
                }
            return false;
        }
 
        // Возвращает значение n-го элемента списка. Пользователь должен
        // быть уверен, что element_num  не меньше единицы и не больше,
        // чем размер списка.
 
        T get_nth(const int element_num) const {
                if(element_num < 1) throw "get_nth argument less than one";
 
                int count = 1;
                for ( List_node *sn = head; sn !=tail; sn = sn->next) {
                    if (count++ == element_num) return sn->val;
                }
 
                throw "element_num exceeds list size";
        }
 
        // Возвращает размер списка, подсчитывая его элементы.
        // Неэффективна, поскольку предполагается, что такая операция
        //  не будет частой (для тестирования), и поэтому лучше затратить
        // здесь дополнительное время, чем терять его на модификацию
        // переменной размера списка при каждом включении/удалении элемента.
 
        int size() const {
                if(is_empty()) return 0;
                int count = 0;
                for(List_node *sn = head; sn != tail; sn=sn->next) ++count;
                return count;
        }
 
        // Печатает список удобно и эффективно
 
        void print() const {
                for (List_node *sn = head; sn != tail; sn = sn->next) {
                        sn->print_val();
                }
                cout << endl;
        }
 
        //
        // Здесь начинаются функции, поддерживающие перечислитель.
        //
 
        void reset_current() { current = head; }
 
        bool increment_current() {
                if(current != tail) {
                        current = current->next;
                        return true;
                }
                return false;
        }
 
        // Вызов get_current в случае, если current == tail не определено.
        // Пользователь должен проверить.
        T get_current() const { return current->val;}
 
        bool current_is_tail() const { return current == tail; }
 
        // Заметьте, что current  не изменяется.
        bool insert_after_current(const T node_val) {
                if (current_is_tail()) return false;
 
                List_node *node_to_add = new List_node(node_val);
                node_to_add->next = current->next;
                current->next = node_to_add;
        }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2014, 14:54     Необходимо создать список, элемент которого может быть список
Посмотрите здесь:

Реализовать двухсвязный список. Каждый элемент списка может содержать один объект C++
C++ Список: Как добавлять элемент в список, не в начало и не в конец, а между 1 и 2 элементами списка?
Реализовать двусвязный список. В разных узлах одного списка может быть любой объект одного из допустимых типов (своих знаний не хватает) C++
C++ создать список л3 из элементов входящих и в список л1 и в список л2
Создать список целых чисел. Создать новый список, записав в него отрицательные элементы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
04.02.2014, 15:12     Необходимо создать список, элемент которого может быть список #2
А в чем вопрос?
Sgushenka
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 9
04.02.2014, 15:22  [ТС]     Необходимо создать список, элемент которого может быть список #3
Цитата Сообщение от Ilot Посмотреть сообщение
А в чем вопрос?
Можете показать как сделать список в списке для моей программы?...
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
04.02.2014, 15:24     Необходимо создать список, элемент которого может быть список #4
C++
1
List<List<int> >
Так?
Sgushenka
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 9
04.02.2014, 15:56  [ТС]     Необходимо создать список, элемент которого может быть список #5
Цитата Сообщение от Ilot Посмотреть сообщение
C++
1
List<List<int> >
Так?
А ругаться на такое компилятор не станет?)
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
04.02.2014, 16:04     Необходимо создать список, элемент которого может быть список #6
С чего вдруг?
Sgushenka
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 9
04.02.2014, 16:06  [ТС]     Необходимо создать список, элемент которого может быть список #7
Такое чувство, что единственное, что компилятор не сможет съесть - это пирожки с капустой в моей школьной столовой...
Ilot
04.02.2014, 16:07
  #8

Не по теме:

Занимательная у нас беседа выходит...

gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
04.02.2014, 18:31     Необходимо создать список, элемент которого может быть список #9
Цитата Сообщение от Sgushenka Посмотреть сообщение
А ругаться на такое компилятор не станет?)
Вы, написав реализацию связанного списка, спрашиваете такое?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2014, 18:32     Необходимо создать список, элемент которого может быть список
Еще ссылки по теме:

C++ Создать массив, элементами которого являются структуры – список учеников
C++ Необходимо создать связной список с записью в файл и восстановлением из файла

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

Или воспользуйтесь поиском по форуму:
Sgushenka
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 9
04.02.2014, 18:32  [ТС]     Необходимо создать список, элемент которого может быть список #10
Я устал весь день это писать, завтра уже сдавать, а есть другие задачи...
Yandex
Объявления
04.02.2014, 18:32     Необходимо создать список, элемент которого может быть список
Ответ Создать тему
Опции темы

Текущее время: 13:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru