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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.60
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
#1

Связанный двусторонний список - C++

29.06.2010, 19:57. Просмотров 1954. Ответов 19
Метки нет (Все метки)

Решил написать свой двусторонний список и совершенно внезапно столкнулся с проблеммой отчистки. Итак вот класс элемента списка и его деструктор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class T>
class mListNode
{
public:
    mListNode();
    mListNode(const mListNode<T>&);
    ~mListNode();
    void setNext(mListNode* newNext) { next = newNext;};
    void setPrev(mListNode* newPrev) { prev = newPrev;};
    void setInfo(T* inf)             { info = inf;  };
    mListNode* getNext() const       { return next; };
    mListNode* getPrev() const       { return prev; };
    T* getInfo() const               { return info; };
    mListNode<T>& operator= (const mListNode<T>&);
protected:
    T* info;
    mListNode* prev;
    mListNode* next;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <class T>
mListNode<T>::~mListNode()
{
    cout << "info\n";
    delete info;
    info = NULL;
    cout << "prev\n";
    delete prev;
    prev = NULL;
    cout << "next\n";
    delete next;
    next = NULL;
}
Объявления класса списка, функции удаления:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <class T>
class mList
{
public:
    mList() { size = 0; head = 0;};
    mList(const mList<T>&);
    //~mList();
    void pushBack(T& inf);                      
    void pushTop(T& inf);                       
    mList<T>& operator=(const mList<T>&);
    T& operator[] (unsigned int num) const ;    
    void clear();                              
    void popFront();
    class exOutOfRange { };                     // oor exeption
protected:
    mListNode<T>* head;
    unsigned int size;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <class T>
void mList<T>::clear()
{
    if (size == 0)
        return;
    while (size != 0)
    {
        popFront();
    }
 
}
template <class T>
void mList<T>::popFront()
{
    if (size == 0)
        return;
    mListNode<T>* tmp = head;
    head = head->getNext();
    delete tmp;
    size--;
    head->setPrev(NULL);
 
}
Подабавлял int, нормально выводит. При попытке вытолкнуть элемент или очистить (впринципе одно и тоже) программа крашиться в консоли последняя строчка info (см деструктор элемента списка) и вываливается сообщение:

Debug Assertion Failed!
...dbgdel.cpp
line:52

Expression: _BLOCK_TYPE_IS_VALID (pHead->nBlockUse)

Как понимаю я по многу раз удаляю одно и тоже, но никак не могу понять где утечка >.<
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2010, 19:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Связанный двусторонний список (C++):

двусторонний список - C++
помогите понять почему программа не работает, и как сделать чтобы она заработала #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include...

Связанный список. Создать, записать в связный список последовательность слов,обозначающих месяцы года,заданных пользователем - C++
Создать связанный список.Кроме информационных полей он должен обязательно содержать указатели на предыдущий и следующий за ним...

Связанный список - C++
Доброе утро есть ли у кого пример Связанного списка. И чем он вообще отличаетьсяот массива кроме того , что связанный список динамичен.

Связанный список - C++
Не могу обратиться к методу класса Node хотя они выраженны как public: void addNode(int d); void printList(); #include&lt;iostream&gt; ...

Связанный список - C++
ребят,нужна помощь. короче дело в том,что нужно &quot;то есть тебе нужно поменять местами ссылки друг на друга.. то есть когда ты считываешь...

Связанный список. - C++
Компилятор ругается на строку 169 In member function `virtual Node* HeadNode::Insert(Data*)': 169 argument of type...

19
time2die
51 / 51 / 3
Регистрация: 25.05.2010
Сообщений: 182
29.06.2010, 20:20 #2
хм.... у тебя есть спсок
x----y----z
потом ты удалил y и получилось
x----мусор---z
как, бы при удалении члена списка, нужно перевязать у соседних элементов указатели на следующий и предыдущий
0
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
29.06.2010, 20:39  [ТС] #3
Так я удаляю не из серидины а выталкиванием первого элемента
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class T>
void mList<T>::popFront()
{
    if (size == 0)
        return;
    mListNode<T>* tmp = head;
    head = head->getNext();
    delete tmp;
    size--;
    head->setPrev(NULL);
 
}
тут я выбираю начальным элементом второй элемент списка, после этого удаляю первый, а у второго предыдущий элемент ставлю равным нулю.
0
time2die
51 / 51 / 3
Регистрация: 25.05.2010
Сообщений: 182
29.06.2010, 21:15 #4
прости, за глупый вопрос, но зачем тебе в связном списке функция pop и push ? не легче, если у тебя уже есть add & delete, реализовать их через них ?
0
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
29.06.2010, 22:05  [ТС] #5
тоесть как зачем функция push? это собственно и есть add, а pop = delete. Но вопрос не об этом, а о том, что собсвенно pop и выдает ошибку.

Кстати если убрать мой деструктор элемента списка программа не крашиться, но и память собственно не освобождается >.<
0
mih
6 / 6 / 1
Регистрация: 10.05.2010
Сообщений: 56
29.06.2010, 22:16 #6
попробуй [] после delete...
0
time2die
51 / 51 / 3
Регистрация: 25.05.2010
Сообщений: 182
29.06.2010, 22:16 #7
Spellz, чего-то я сегодня не соображаю ничего, как насчёт посмотрет ьв дебаггере на каком именно моменте программа крашится ?
0
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
29.06.2010, 22:40  [ТС] #8
Цитата Сообщение от mih Посмотреть сообщение
попробуй [] после delete...
delete[] удаляет указатель на массив и собственно сам массив в динамической памяти, если я ничего не путаю. В любом случае попробовал, не работает.


Цитата Сообщение от time2die Посмотреть сообщение
Spellz, чего-то я сегодня не соображаю ничего, как насчёт посмотрет ьв дебаггере на каком именно моменте программа крашится ?
Программа крашиться при попытке приминения функций pop или clear. Если быть точнее, тогда когда программа "попадает" в деструктор mListNode
0
mih
6 / 6 / 1
Регистрация: 10.05.2010
Сообщений: 56
29.06.2010, 23:24 #9
а как насчет конструктора mListNode ?
в студию плиз...

Добавлено через 14 минут
оо новая теория ))
в ~mListNode не надо delete Next и Prev
о как )))
0
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
29.06.2010, 23:24  [ТС] #10
Копий
C++
1
2
3
4
5
6
7
template <class T>
mListNode<T>::mListNode(const mListNode<T> & rhs)
{   
    info = rhs.info;
    prev = rhs.prev;
    next = rhs.next;
}
Обычный
C++
1
2
3
4
5
template <class T>
mListNode<T>::mListNode():
info(0) , prev(0), next(0)
{
}
0
mih
6 / 6 / 1
Регистрация: 10.05.2010
Сообщений: 56
29.06.2010, 23:29 #11
ну не удаляй next и prev и да прибудет стобой сила
0
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
29.06.2010, 23:38  [ТС] #12
Прога подвисает на удаление info, до next и prev еще не доползли
0
mih
6 / 6 / 1
Регистрация: 10.05.2010
Сообщений: 56
29.06.2010, 23:46 #13
в таком случае +main
0
Spellz
1 / 1 / 0
Регистрация: 29.01.2010
Сообщений: 25
29.06.2010, 23:57  [ТС] #14
всмысле?
0
mih
6 / 6 / 1
Регистрация: 10.05.2010
Сообщений: 56
30.06.2010, 00:30 #15
выкладывай всю прогу
0
30.06.2010, 00:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2010, 00:30
Привет! Вот еще темы с ответами:

Связанный список - C++
Всем доброго время суток, написать программу демонстрации связанного списка, где PART - (ДЕТАЛЬ) содержит номер детали и остальную...

И снова связанный список - C++
Есть кусок связанного списка, только начал его делать, в тырнете много примеров как он реализован на структурах, в одних случаях структура...

Связанный список (ООП) - C++
Ребят , помогите с лабой пожалуйста. Вот задание : Створити динамічний клас University, що базується на зв’язному списку, де кожний...

Циклический связанный список - C++
Доброго времени суток. Пытаюсь посчитать количество значений в циклическом списке. Но всегда получается на 1 значение меньше. Или я должен...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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