Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2011, 13:07   #11
Раввин
Новичок
Джуниор
 
Регистрация: 12.07.2011
Сообщений: 12
По умолчанию

Тогда как минимум сразу избавься от цикла по n. Лучше сделай примерно так:

while (first != last)
{
var next = first->next; // запомнили второй элемент
delete first; // удалили первый
first = next; // теперь второй стал первым
}

if (first) delete first; //удалили последний элемент

Это не готовый код, только общая суть алгоритма.
Раввин вне форума Ответить с цитированием
Старый 12.07.2011, 13:09   #12
Раввин
Новичок
Джуниор
 
Регистрация: 12.07.2011
Сообщений: 12
По умолчанию

Насчёт "не работает". Не работать может по-разному. Ошибку выдает - какую? На какой строчке, в какой операции? Пошаговая отладка - очень хороший инструмент.
Раввин вне форума Ответить с цитированием
Старый 12.07.2011, 13:17   #13
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Цитата:
Сообщение от Раввин Посмотреть сообщение
Насчёт "не работает". Не работать может по-разному. Ошибку выдает - какую? На какой строчке, в какой операции? Пошаговая отладка - очень хороший инструмент.
Ошибка всмысле критическая!
Видать за пределы кудато вываливаюсь!
sir.andrey вне форума Ответить с цитированием
Старый 12.07.2011, 13:26   #14
Раввин
Новичок
Джуниор
 
Регистрация: 12.07.2011
Сообщений: 12
По умолчанию

Немудрено. В visual studio работаешь? Там клавиша F11. В других средах не помню. Брейкпоинт поставь на начало процедуры, заполни свой список тремя элементами, вызови функцию удаления и отслеживай, что за мусор она у тебя попытается удалить.

* Два раза один и тот же указатель удалять нельзя.
* Указатель, который ты получил не через new, удалять нельзя.
* NULL удалять нельзя (хотя вроде программа не падает, всё равно это плохой стиль)
* Произвольный мусорный указатель на не пойми что удалять нельзя.

Если дело не в этом, ты меня удивишь.

Не научишься дебажиться - программистом не станешь, поверь старому еврею.

Последний раз редактировалось Раввин; 12.07.2011 в 13:33.
Раввин вне форума Ответить с цитированием
Старый 12.07.2011, 13:48   #15
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Цитата:
Сообщение от Раввин Посмотреть сообщение
* Указатель, который ты получил не через new, удалять нельзя.
Это получается, которые через конструктор обьявлены?
sir.andrey вне форума Ответить с цитированием
Старый 12.07.2011, 14:01   #16
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Ошибок больше нет, после удаления массива запускаю ф-цию вывода на экран, но вылазит та же критическая ошибка!


Код:
void CStack::showing()
{
	cout << "Massiv: ";
	buffer=first;
	while( buffer != NULL ){
		cout << buffer->data << " ";
		buffer=buffer->next;
	}
	buffer=NULL;
}


//Удаление динамического массива
void CStack::destroy()
{
	link* del=new link;
	del=last;
	while( first!=last ){

		last=last->prev;
		last->next=NULL;
		delete del;
		del=last;

	}
	if( first==last ) delete del;
}
sir.andrey вне форума Ответить с цитированием
Старый 12.07.2011, 14:04   #17
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Все отлично, разобрался!
Спасибо всем за помощь!
sir.andrey вне форума Ответить с цитированием
Старый 12.07.2011, 14:28   #18
Раввин
Новичок
Джуниор
 
Регистрация: 12.07.2011
Сообщений: 12
По умолчанию

Цитата:
Сообщение от sir.andrey Посмотреть сообщение
Это получается, которые через конструктор обьявлены?
Не, друг мой, это те, которые вот так сделаны:

pointer = new Class();

Хотя можно назвать и так, "через конструктор объявлены"... Наверное, это оно.

По поводу:
last->next=NULL;

Ты last всё равно удалишь в следующем проходе, можешь не заботиться о поле next, раз оно не используется нигде до удаления. Но тенденция хорошая, лучше переосторожничать, чем недоосторожничать.

А вот тут:
if( first==last ) delete del;

Лучше проверь if (del). first==last при пустом списке вернет true, потому что они оба будут NULL, и ты удалишь пустой указатель, это некрасиво.

Плюс к тому же:
while( first!=last ) { ... }
if( first==last ) delete del;

Если ты вышел из цикла, значит, first==last по определению и тебе не надо это перепроверять.

А так молодец, что разобрался и заставил работать.
Раввин вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
списки Inna_L HTML и CSS 2 11.12.2010 17:34
Списки Хорнет Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2010 09:55
списки sergeykl Паскаль, Turbo Pascal, PascalABC.NET 8 04.08.2009 23:05