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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2012, 18:11   #1
InKo1
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 18
По умолчанию Связный список

Код:
template <class Type>
class List
    {
        List<Type>* pNext;
        List<Type>* pBack;
        private:
            Type item;
            int Items;
            List<Type>* pHead; // Начало списка
            List<Type>* pTail; // Конец списка
        public:
            bool remove(const Type t);
            bool popFront(); // Удаляет первый элемент списка
    };

template <class Type>
bool List<Type>::popFront()
    {
        if(isEmpty())
            return false;
        List<Type>* buf = pHead;
        Items--;
        pHead = pHead -> pNext;
        if(pHead != NULL)
            pHead -> pBack = NULL;
        delete buf;
        if(isEmpty())
            pTail = NULL;
        return true;
    }

template <class Type>
bool List<Type>::remove(Type Data)
    {
        if(isEmpty())
            return false;
        List<Type>* pFind = pHead; 
        while(pFind) // Цикл
            {
                if(pFind -> item == Data && pFind == pHead) 
                    {
                        popFront(); 
                        pFind = pHead; 
                    }
                else if(pFind -> item == Data) 
                    {
                        List<Type>* buf = pFind; 
                        List<Type>* buf2 = pFind -> pNext; 
                        Items--; 
                        pFind = pFind -> pBack; 
                        if(pFind != NULL) 
                            pFind -> pNext = buf2; 
                        delete buf;
                    }
                else
                    pFind = pFind -> pNext;
            }
        return true;
    }
функция remove() работает некорректно, если в списке два элемента идут подряд, не с головы, например:
2 1 1 8
InKo1 вне форума Ответить с цитированием
Старый 04.03.2012, 23:05   #2
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию

Посмотри Дейтел 5- ое издание, глава20
Желание тысяча возможностей, нежелание - тысяча причин
Стремящийся вне форума Ответить с цитированием
Старый 05.03.2012, 00:13   #3
InKo1
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 18
По умолчанию

Там удаление из середины не рассматривается, но все равно спасибо
InKo1 вне форума Ответить с цитированием
Старый 05.03.2012, 23:35   #4
mrNobody
 
Аватар для mrNobody
 
Регистрация: 24.07.2011
Сообщений: 5
По умолчанию

М... подозревая что дело в том, что при удалении элемента, вы не изменяете указатель back следующего элемента после удаляемого, поэтому при удалении следующего элемента (он ведь такой же!) он, обращаясь по указателю back обратиться уже к освобождённой области памяти.

Короче говоря, у вас есть код:

Код:
pFind = pFind -> pBack; 
if(pFind != NULL) 
  pFind -> pNext = buf2;
нужно добавить ещё:
Код:
if (buf2 != NULL)
  buf2->back = pFind;
Подозреваю, что это решит проблему.
"Восемнадцать лет, пять месяцев и утро ещё одного дня прожила на свете Люба Шевцова."
mrNobody вне форума Ответить с цитированием
Старый 06.03.2012, 01:11   #5
InKo1
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 18
По умолчанию

Спасибо, всё работает
InKo1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связный список InKo1 Помощь студентам 0 22.12.2011 02:08
Связный список GripEnemy Visual C++ 2 08.12.2011 16:19
Связный список batman01 Общие вопросы C/C++ 1 15.10.2011 01:31
связный список xeops Visual C++ 6 30.09.2011 09:39
Связный список С++ Шёпот Общие вопросы C/C++ 2 01.04.2011 22:56