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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
_Ант_
-113 / 1 / 0
Регистрация: 18.10.2012
Сообщений: 30
#1

Попытка реализовать чтото типо контейнера list - C++

22.02.2013, 05:45. Просмотров 784. Ответов 6
Метки нет (Все метки)

Попытка реализовать чтото типо контейнера list
я не могу сообразить, чего тут не правильно. Может кто поможет, код вроде не сложный..
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
# include <iostream>
 
using namespace std;
 
class list{
protected:
    double val;
    list* next;
public:
    list(){ val=0; next=nullptr;}
    void add(double &&v){
        list* t = new list;
        list n = *this;
        while (n.next!=nullptr){
            n = *n.next;
            cout<<"added\n";
        }
        n.next = t;
        t->val=v;cout<<t->val<<"  ";
        t->next=nullptr;
    }
    void print(){
        list *n = this;
        while (n->next!=nullptr){
            cout<<n->val<<" ";
            n = n->next;
        }
        cout<<n->val<<" ";
    }
    ~list(){
        list *n = this;
        while (n->next!=nullptr){
            delete n;
            n = n->next;
            cout<<"destructor\n";
        }
    }
};
 
int main(){
    list l;
    l.add(3);
    l.add(4);
    l.print();
    cout<<"done\n";
 
    system("PAUSE");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2013, 05:45     Попытка реализовать чтото типо контейнера list
Посмотрите здесь:

C++ Как реализовать работу со списком строк и списком цифр в классе List?
C++ Игровой автомат,чтото не пойму
Начал изучать уже ошибки , или чтото не то делаю я ( C++
C++ В чем ошибка? программа с использованием контейнера list
Сортировка контейнера list C++
C++ Реализовать структуру "Список с пропусками" (Skip List)
C++ Не могу реализовать метод visit() класса List
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MLPMan
Кандёхаем веселее!
282 / 276 / 34
Регистрация: 02.10.2012
Сообщений: 1,939
22.02.2013, 07:03     Попытка реализовать чтото типо контейнера list #2
C++
1
2
3
4
5
6
7
8
9
10
    ~list(){
        list *n = this->next;
        list *f;
        while (true){
            if (n!=NULL) {f = n->next;} else {break;}
            delete n;
            if (f==NULL) break;
            n = f;
                }
    }
По ходу такой прикол, что "корневой" list удалять нельзя, потому, что его удаляет пользователь после использования(***):

C++
1
2
3
4
5
6
list *l1 = new list;
l1->add(100);
l1->add(133);
l1->add(256);
l1->add(2322);
delete l1; // <-- ***
_Ант_
-113 / 1 / 0
Регистрация: 18.10.2012
Сообщений: 30
22.02.2013, 07:25  [ТС]     Попытка реализовать чтото типо контейнера list #3
Да, теперь получше, но компилятор передает сейчас исключение - стек переполнен, в деструкторе класса:

C++
1
2
3
4
5
6
7
8
~list(){
        list *n = this;
        while (n->next!=nullptr){
            delete n;
            n = n->next;
            cout<<"destructor\n";
        }
    }
не знаешь в чем тут может быть ошибка?
anmartex
...
1701 / 1194 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
22.02.2013, 07:45     Попытка реализовать чтото типо контейнера list #4
_Ант_, интересно, сначала:
C++
1
         delete n;
А затем:
C++
1
         n = n->next;
Вы понимаете, что сначала освободили память под указателем, а потом разадресовывать начинаете.

Хм... Т.е. последний элемент удалять не нужно?:
C++
1
      while (n->next!=nullptr){
А если this будет равен nullptr?
_Ант_
-113 / 1 / 0
Регистрация: 18.10.2012
Сообщений: 30
22.02.2013, 08:42  [ТС]     Попытка реализовать чтото типо контейнера list #5
anmartex, понял, исправил, но все равно еще есть ошибка - Необработанное исключение в "0x00254979" в "list.exe": 0xC00000FD: Stack overflow.
C++
1
2
3
4
5
6
7
8
9
10
    ~list(){
        list *n = this;
        list* prev;
        while (n->next!=nullptr){
            prev = n;
            n = n->next;
            delete prev;
            cout<<"destructor\n";
        }
    }
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
22.02.2013, 10:20     Попытка реализовать чтото типо контейнера list #6
Не вызывайте delete в самом же деструкторе. Этот delete приводит к вызову этого же деструктора.

Я бы посоветовал переделать список вот таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 class list{
 protected:
-    double val;
-    list* next;
+    class node {
+        double val;
+        node *next;
+    };
+private:
+    node *head;
 public:
-    list(){ val=0; next=nullptr;}
+    list() : head(nullptr) {}
(Ну и ещё немного фарша: удобные конструкторы для node, метод list, вызывающий delete для всех элементов цепочки node, и т. д.)

Потому что иначе у вас или стек захлебнётся, или вам надо будет собирать этот список в массив, чтобы удалить, или удалять список вручную, не с помощью деструктора.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2013, 10:43     Попытка реализовать чтото типо контейнера list
Еще ссылки по теме:

C++ Реализовать возможности контейнера vector используя класс стек
Попытка реализовать односвязный линейный список C++
C++ Указатель на элемент контейнера list
Использование контейнера list C++
В пользовательском классе List (список) реализовать вставку элемента после заданного элемента C++

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

Или воспользуйтесь поиском по форуму:
anmartex
...
1701 / 1194 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
22.02.2013, 10:43     Попытка реализовать чтото типо контейнера list #7
~OhMyGodSoLong~, блин, а слона-то я и не заметил! :-D +1
Yandex
Объявления
22.02.2013, 10:43     Попытка реализовать чтото типо контейнера list
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru