Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Debug Assertion Failed, и ничего непонятно 
:(
    Опции темы
Ander
Дата 23.2.2004, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 17.11.2003
Где: Рига, Латвия

Репутация: нет
Всего: 1



Вот, наваял чего-то со списками. При запуске выдаёт таблицу со следующим содержанием, при этом список она всё-таки выводит (здесь файлы можно как-нибудь прикрепить?):

Debug Assertion Failed!
Program: bla-bla-bla\mylist1.exe
File: dbgheap.cLine:1044

Expression: _CrtIsValidHeapPointer(PUserData)

Смотрел хелп - так и не понял, в чём дело.
Код:
Цитата

#include <iostream>
#include <time.h>
#include <stdlib.h>
#define list node*
using namespace std;

void main(void)
{
srand(unsigned int(time(NULL)));
const N=10;
struct node
{
  int n;
  node* next;
  node(int v, node* t)
  {
  n=v;
  next=t;
  }
};

list base=new node(0,NULL);
list x=base;
for(int i=1; i<N; i++)
{
  x->next=new node(rand(),base);
  x=x->next;
}

                x=base;
do
{
  cout << x->n << endl;
  x=x->next;
}while(x!=base);

x=base;
do
{
  base=x;
  x=x->next;
  delete base;
}while(x!=NULL);
}



PM MAIL   Вверх
mr.DUDA
Дата 23.2.2004, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Список кольцевой, так ?

Значит,
Цитата
do
{
  base=x;
  x=x->next;
  delete base;
}while(x!=NULL);

пройдёт по 10-ти элементам, удалив их, а перед удалением последнего - настроит указатель "x" на значение "next" из последнего элемента, которое указывет на самый первый (уже удалённый !) элемент.

Чего тут сделать можно ? Запомнить указатель на первый элемент, и сравнивать "x" не с NULL, а с этим указателем:
Цитата
list first = base;
do
{
  base=x;
  x=x->next;
  delete base;
}while(x!=first);



--------------------
user posted image
PM MAIL WWW   Вверх
Ander
Дата 23.2.2004, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 17.11.2003
Где: Рига, Латвия

Репутация: нет
Всего: 1



Да, теперь всё работает, но я не понимаю:

Цитата

а перед удалением последнего - настроит указатель "x" на значение "next" из последнего элемента, которое указывет на самый первый (уже удалённый !) элемент.


разве в этом случае x не должен указывать на NULL?
PM MAIL   Вверх
mr.DUDA
Дата 23.2.2004, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
разве в этом случае x не должен указывать на NULL?

нет. список кольцевой:
Цитата
list base=new node(0,NULL);
list x=base;
for(int i=1; i<N; i++)
{
  x->next=new node(rand(),base);
  x=x->next;
}

в выделенной строке создаётся элемент списка, в конструктор которого передаётся указатель на первый элемент (base) списка. Далее, из строки "x->next=" получается что все элементы, кроме последнего, настроены своим "next" на следующий элемент (ведь для последнего элемента цикл не выполняется !). Последний элемент настроен указателем "next" на первый элемент, а не на NULL.


--------------------
user posted image
PM MAIL WWW   Вверх
Ander
Дата 24.2.2004, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 17.11.2003
Где: Рига, Латвия

Репутация: нет
Всего: 1



Теперь ясно. Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.