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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очистка связного списка, Двунаправленный список 
V
    Опции темы
Vaz007
Дата 23.10.2012, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброй ночи.Проблема в удалении двунаправленного списка.
Вот список:
Код

struct Double_List {
                    int num; 
                    string name;
                    Double_List *Next,*Prev; 
                   } A={0," ",NULL,NULL},*A_Head;
void Delete_Double_List(Double_List* Head);

А вот реализация функции очистки:
Код

void Delete_Double_List(Double_List* Head)
{
  if (Head != NULL)
  {
  Delete_Double_List(Head->Next);
  delete Head;
  } 
}


Вот программа:
Код

int _tmain(int argc, _TCHAR* argv[])
{

    int n;

    cout <<"Enter the number of player(s) : "<<endl;
    IsNumber(n);

    Make_Double_List(n,&A_Head,A.Prev);

    cout <<"Your LIST: " <<endl;
    Print_Double_List(A_Head);
    
   
    Delete_Double_List(A_Head);
    Print_Double_List(A_Head);
    return 0;
}

Все хорошо работает , пока не пытаюсь очистить список(  IsNumber(n) - ввод кол-ва элементов и проверка на число;Make_Double_List(n,&A_Head,A.Prev) - создание списка;Print_Double_List(A_Head) - вывод на экран)
Вылетает ошибка: Необработанное исключение в "0x77b315de" в "Spisok.exe": 0xC0000005: Нарушение прав доступа при чтении "0xfeeefeee".
Подскажите пожалуйста, как исправить ?
PM MAIL Jabber   Вверх
feodorv
Дата 24.10.2012, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Vaz007 @  23.10.2012,  23:58 Найти цитируемый пост)
Все хорошо работает , пока не пытаюсь очистить список

Функция очистки списка написана хоть и своеобразно, рекурсивно, но правильно. Иное дело - создание списка. Судя по наличию такого кода:
Цитата(Vaz007 @  23.10.2012,  23:58 Найти цитируемый пост)
                   } A={0," ",NULL,NULL}
 и 
Цитата(Vaz007 @  23.10.2012,  23:58 Найти цитируемый пост)
    Make_Double_List(n,&A_Head,A.Prev);
приходит понимание, что список создан кривовато... 


А уж печать списка после его очистки
Цитата(Vaz007 @  23.10.2012,  23:58 Найти цитируемый пост)
    Print_Double_List(A_Head);

и вовсе нонсенс, так как память под A_Head уже освобождена (и, судя по значению указателя 0xfeeefeee, ещё и переинициализирована заботливым delete).
Может, программа рушится именно в последнем Print_Double_List, а не в Delete_Double_List?

Как насчёт навыков работы с отладчиком?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Vaz007
Дата 24.10.2012, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Навык работы с отладчиком есть, да вы правы все именно так , вылетает после вывода)))Спасибо большое. И можно попросить показать на моем примере как лучше создать список ,почему он создан кривовато?
Вот код функции создания:
Код

void Make_Double_List(int n,Double_List** Head,Double_List* Prev)
{
  if (n > 0) 
  {
    (*Head) = new Double_List;
    IsString((*Head)->name);
    cout <<"number:  "<<endl;
    IsNumber((*Head)->num);
    (*Head)->Prev = Prev;
    (*Head)->Next=NULL;
    Make_Double_List(n-1,&((*Head)->Next),(*Head));
  }
  else (*Head) = NULL;
}


PM MAIL Jabber   Вверх
baldina
Дата 24.10.2012, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Vaz007, дело не в Make_Double_List(), а в ёё использовании:
Код

Make_Double_List(n,&A_Head,A.Prev);

в качестве предыдущего передается A.Prev. а что насчет самого A, он повис?

Добавлено через 5 минут и 26 секунд
кстати, гораздо удобнее не передавать адреса, а использовать возвращаемое значение.
заодно разнести все по функциям (одна задача - одна функция)
Код

Double_List* CreateNode (int num, string name="") {
  Double_List *node = new Double_List;
  node->num  = num;
  node->name = name;
  node->Next = 0;
  node->Prev = 0;
  return node;
}

Double_List* InsertNode (Double_List* head, Double_List* tail) {
  if (head)
    head->Prev = tail;
  if (tail) {
    tail->Next = head;
    head = tail;
  }

  return head;
}

Double_List *Make_Double_List (int n, int i=0, Double_List *head=0) {
  if (i < n)
    head = Make_Double_List (n, i+1, head);
  return InsertNode (head, CreateNode (i));
}


Добавлено через 10 минут и 27 секунд
думаю нерекурсивная версия Make_Double_List() будет не менее понятна smile
Код

Double_List *Make_Double_List (int n) {
  Double_List *head=0;
  while (n>=0)
     head = InsertNode (head, CreateNode (n--));
  return head;
}

PM MAIL   Вверх
feodorv
Дата 24.10.2012, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Vaz007 @  24.10.2012,  16:49 Найти цитируемый пост)
он создан кривовато
  • у головы списка есть предыдущий элемент - A; зачем? Почему не просто 
    Код
    Make_Double_List(n,&A_Head,NULL);
    ?
  • Вы пользуетесь рекурсией, тогда как всё можно, да и по большому счёту нужно, написать без рекурсии (если, конечно, задача не стоит использовать рекурсию)
  • при очистке списка нужно занулять голову A_Head:
    Код
    A_Head = NULL;
     (а в Print_Double_List проверять, что список не пустой)
  • если понадобится добавить в список (в хвост) ещё элементов, что Вы будете делать?
  • что происходит с элементом структуры 
    Цитата(Vaz007 @  23.10.2012,  23:58 Найти цитируемый пост)
           string name;
     Кто вызывает конструктор и деструктор класса string? Что делают функции IsString и IsNumber?



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Vaz007
Дата 27.10.2012, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Скажите пожалуйста ,как правильно создать список без рекурсии?
PM MAIL Jabber   Вверх
baldina
Дата 29.10.2012, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



погляди выше, я же написал
PM MAIL   Вверх
Vaz007
Дата 29.10.2012, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ой простите, спасибо большое, проблема решена.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0846 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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