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

абстрактный тип данных - C++

Восстановить пароль Регистрация
 
Svetilka666
0 / 0 / 0
Регистрация: 03.07.2011
Сообщений: 12
05.07.2011, 19:41     абстрактный тип данных #1
надо написать на С++...
разработать абстрактный тип данных :двусвязный циклический список. атд должен обеспечивать выполнение следующих операций:
1)добавление элемента в список
2)удаление элемента из списка
3)редактирование элемента в списке
4)просмотр нескольких списков
5)объединение нескольких списков
6)определение количества элементов в списке

написать демонстрационную программу с комментариями для работы с атд. программа должна иллюстрировать выполнение всех заявленных операций атд.
примечания:
1 атд при необходимости должен содержать конструкторы класса и деструктор
2 ввод данных не должен осуществляться в методах класса.данные необходимо получать в демонстрационной программе и передавать объекту класса в качестве параметров
3 атд должен содежать не менее 2-х переопределенных функций
4 атд должен содержать как минимум один переопределенный оператор
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2011, 19:41     абстрактный тип данных
Посмотрите здесь:

C++ Абстрактный тип данных-Список(С++ алгоритмы)
C++ Как описать абстрактный тип данных?
C++ Создать абстрактный тип данных (структура) - окно
Абстрактный тип данных C++
C++ Абстрактный тип данных
C++ Абстрактный тип данных
C++ Абстрактный тип данных
Абстрактный тип данных C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
06.07.2011, 05:57     абстрактный тип данных #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
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
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#include <stdio.h>
#include <stdlib.h>
#include <string>
 
template<class T>
class  xList {
     struct xNode {
        T       data;
        xNode*  next;
        xNode*  prev;
     };
private:
        xNode*  link;
        xNode*  iter;
        size_t    size;
        size_t    len;
public:
        xList(void): link(NULL), size(0U), len(0), iter(NULL){}
 
        xList(xList&  hLst) {  // конструктор копирования
           link = iter = NULL;
           size = len  = 0U;
           hLst.reset_next();
           while(hLst.is_read()) {
              this->add_tail( hLst.current());
              hLst.move_next();
           }
           hLst.reset_next();
    }
    ~xList(){ this->clear(); }
public:
    // вставить элемент в конец "хвост"
       void  add_tail(T  hData) {
            xNode * node = new xNode();
            node->data   = hData;
            if(! link) {
                link       = node;
                node->next = link;
                node->prev = link;
            } else {
                node->next = link;
                node->prev = link->prev;
                link->prev->next = node;
                link->prev       = node;
            }
            size++;
        }
 
    // вставить элемент в начало "голову"
        void  add_head(T  hData) {
             xNode * node = new xNode();
             node->data   = hData;
             if(! link) {
                  link = node;
                  node->next = link;
                  node->prev = link;
             } else {
                  node->next = link;
                  node->prev = link->prev;
                  link->prev = node;
                  link = node;
             }
             size++;
    }
 
       // удалить самый первый элемент из "головы выбить"
        void  pop_head(void) {
            if(size <= 1u) {
                   this->clear();
                 return;
            }
            xNode* ptr = link;
            link           = link->next;
            link->prev  = ptr->prev;
            link->prev->next = ptr->next;
            delete  ptr;
            ptr = NULL;
            size--;
    }
 
       // удалить самый последний элемент "укоротить хвост" 
        void   pop_tail(void) {
             if(size <= 1u) {
                   this->clear();
                return;
             }
             xNode*  ptr = link->prev;
             link->prev   = ptr->prev;
             link->prev->next = ptr->next;
             delete  ptr;
             ptr = NULL;
             size--;
     }
 
        //  Удалить элемент по-индексу из списка
         void  remove(size_t  hIndex) {
              if( hIndex + 1u >= size) {
                     this->pop_tail();
                   return;
               }
               if( ! hIndex) {
                    this->pop_head();
                   return;
               }
               xNode*  tmp = link;
               while(hIndex--)
                   tmp = tmp->next;
               xNode* ptr = tmp;
               tmp->prev->next = tmp->next;
               tmp->next->prev = tmp->prev;
               delete ptr;
               ptr = NULL;
               size--;
         }
 
         // присвоить данные по-индексу
         void   set_data(size_t  hIndex, T  hData) {
              xNode*  ptr = link;
              while(hIndex--)
                    ptr = ptr->next;
              ptr->data = hData;
         }
 
         // получить данные по-индексу
         T&  get_data(size_t  hIndex) {
              xNode*  ptr = link;
              while(hIndex--)
                    ptr = ptr->next;
              return ptr->data;
    }
 
         // проверка на "жизнь" списка
         bool  is_null(void) const {
              return  ( ! link) ? false : true;
         }
 
        T&   get_head(void) { return link->data; }  // получить первый элемент
        T&   get_tail(void) { return link->prev->data; } // получить последний элемент
 
         // поиск элемента по-указанному элементу, возвращает индекс
        int  find(T  hFind)  {
              size_t  cnt = size;
              int     len   = 0;
              for(xNode*   iter = link; cnt-- ; iter = iter->next, len++ ) {
                     if(iter->data == hFind)
             return  len;
              }
              return  -1;
         }
 
        // получить кол-во элементов в списке
        size_t   get_size(void) const { return  size; }
 
      //  полное удаление всех элементов списка NULL=PTR
       void  clear(void) {
            while( size-- ) {
                xNode*  ptr = link;
                link = link->next;
                delete ptr;
                ptr  = NULL;
            }
            size = 0u;
            link = NULL;
        }
        
        // метод для чтения данных
        bool  is_read(void) {
            if(len--)
                 return true;
            return  false;
        }
 
       void   reset_next(void){ iter = link; len = size; } // приготовить список для прохода вперёд
       void   reset_prev(void){ iter = link->prev;len = size;}  // приготовить список для прохода назад
       void   move_next(void){  iter  = iter->next; }   // передвинуться на элемент вперёд
       void   move_prev(void){  iter  = iter->prev; }   // передвинуться на элемент назад
 
        T&  current(void) { return  iter->data; } // возвращает текущий элемент итерирования
};
 
 
// структура для испытания списка
struct  person {
   char name[18];
   char city[18];
   int  age;
   person(void) {}
   person(const char*  name, const char* city, int age) {
       strcpy(this->name, name);
       strcpy(this->city, city);
       this->age =  age;
   }
};
 
 
 
 
void main(void)
{
    xList<long>  src;
 
    src.add_tail(2000L);    // добавляем данные в список
    src.add_head(7000L);
    src.add_head(5000L);
    src.add_head(6000L);
    src.add_head(5000L);
    src.add_head(4000L);
    src.add_head(3000L);
 
    xList<long>  dst(src);  // копируем все элементы в дургой список
 
    src.clear();   // удаляем первый список
      
    dst.reset_next();            // приготовиться для прохода вперёд
    while( dst.is_read() )  {
               dst.current() *= 2L;   // умножаем все элементы
        dst.move_next();  // движемся вперёд
    }
 
    int index = dst.find(4000L);  // найти значение
    if(index != -1)  // если нашли показываем результат
          printf("Find number - %d\n", dst.get_data(index));
    
    dst.set_data(dst.get_size() / 2, -7000000L);  // присвоим серединому элементу новое значение
 
    printf("get size xList = %d\n",    dst.get_size());
    printf("get last element: %d\n",  dst.get_tail() );
    printf("get first element: %d\n",  dst.get_head() );
 
    printf("get data to index: %d\n",  dst.get_data(2));
 
    dst.reset_prev();         // приготовить список для прохода назад
    while( dst.is_read() )  {
          printf("\t%d\n", dst.current() );  // выводим
          dst.move_prev(); 
    }
      
    dst.remove(dst.get_size() >> 1);  // удалим элемента котрый находиться по-середине
    dst.pop_head();  // удалить самый первый
    dst.pop_tail();    // удалить самый последний
 
    while( dst.is_null() ) {   // чтение списка с физическим удалением элементов с конца
                printf("-> %d\n", dst.get_tail() );
         dst.pop_tail();
    }
    puts("\n");
 
 
    // тестируем список со структурой    
    xList<person>  plist;
    plist.add_tail(     person("Igor", "Moscow", 25) ); 
    plist.add_head( person("Pavel", "Voronez", 32) );
    plist.add_tail(     person("Sveta", "Chita", 27) );
    plist.add_head( person("Olga", "Tula", 25) );
    plist.add_head( person("Tolik", "Saratov", 22) );
    plist.add_head( person("Marina", "Orenburg", 25) );
 
    person p;                  // здесь ввод
    printf("name: ");
    scanf("%s", p.name);
    printf("city: ");
    scanf("%s", p.city);
    printf("age: ");
    scanf("%d", &p.age);
    plist.add_head(p);
 
    plist.set_data( 2, person("Tarlan", "Ufa", 30));
      
    plist.reset_next();
    while( plist.is_read() ) {
         if(plist.current().age == 25)
               printf("\t\tFN: %s, City: %s\n", plist.current().name, plist.current().city);
         plist.move_next();
    }
    plist.clear();
 
 
  system("pause");
}
Svetilka666
0 / 0 / 0
Регистрация: 03.07.2011
Сообщений: 12
06.07.2011, 22:38  [ТС]     абстрактный тип данных #3
а что за числа в начале выводит программа?
Yandex
Объявления
06.07.2011, 22:38     абстрактный тип данных
Ответ Создать тему
Опции темы

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