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

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

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

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

22.02.2013, 05:45. Просмотров 800. Ответов 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2013, 05:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Попытка реализовать чтото типо контейнера list (C++):

Использование контейнера list - C++
Не могу из методички с задачками по контейнерам решить пару из них. Есть список целых чисел (std::list&lt;int&gt;). Нужно, за один...

Сортировка контейнера list - C++
Как отсортировать (с помощью sort()) и вывести в текстовый документ список l ? код программы: #include &lt;iostream.h&gt; #include &lt;vector&gt;...

Указатель на элемент контейнера list - C++
Здравия желаю. Вопрос такой: будет/может ли меняться адрес элемента, стоящего за удаляемым. Если я, например, передам ссылку на нужный...

В чем ошибка? программа с использованием контейнера list - C++
/*Написать программу,моделирующую управление каталогом в файловой сис* теме. Для каждого файла в каталоге содержатся следующие...

Попытка реализовать односвязный линейный список - C++
Доброго времени суток! Пробую реализовать односвязный линейный список в виде структуры. #include &lt;iostream&gt; #include &lt;cmath&gt; using...

Реализовать собственный аналог контейнера std::map - C++
Нужно реализовать собственный контейнер map. Подскажите как это вообще сделать, ибо совсем не представляю.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MLPMan
Кандёхаем веселее!
286 / 280 / 35
Регистрация: 02.10.2012
Сообщений: 1,992
22.02.2013, 07:03 #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; // <-- ***
0
_Ант_
-113 / 1 / 0
Регистрация: 18.10.2012
Сообщений: 30
22.02.2013, 07:25  [ТС] #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";
        }
    }
не знаешь в чем тут может быть ошибка?
0
anmartex
...
1705 / 1198 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
22.02.2013, 07:45 #4
_Ант_, интересно, сначала:
C++
1
         delete n;
А затем:
C++
1
         n = n->next;
Вы понимаете, что сначала освободили память под указателем, а потом разадресовывать начинаете.

Хм... Т.е. последний элемент удалять не нужно?:
C++
1
      while (n->next!=nullptr){
А если this будет равен nullptr?
0
_Ант_
-113 / 1 / 0
Регистрация: 18.10.2012
Сообщений: 30
22.02.2013, 08:42  [ТС] #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";
        }
    }
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
22.02.2013, 10:20 #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, и т. д.)

Потому что иначе у вас или стек захлебнётся, или вам надо будет собирать этот список в массив, чтобы удалить, или удалять список вручную, не с помощью деструктора.
1
anmartex
...
1705 / 1198 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
22.02.2013, 10:43 #7
~OhMyGodSoLong~, блин, а слона-то я и не заметил! :-D +1
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2013, 10:43
Привет! Вот еще темы с ответами:

Реализовать возможности контейнера vector используя класс стек - C++
Ребята, помогите разобраться с STL . Про использование vector для int и так далее я разобралась. vector&lt;int&gt; array(arraySize); А что...

Не могу реализовать метод visit() класса List - C++
Люди, помогите! Наверняка, известная задача: ---------------------------------------------------------------- Простой список можно...

Реализовать пользовательские классы - дек, стек (LIFO), очередь (FIFO) на базе класса list библиотеки STL - C++
Создать пользовательские классы - дек, стек (LIFO), очередь (FIFO) на базе класса list библиотеки STL. Написать тестирующую программу,...

Как реализовать работу со списком строк и списком цифр в классе List? - C++
Добрый день! Проблема такая Есть класс-список: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.02.2013, 10:43
Ответ Создать тему
Опции темы

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