Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[C++] Связанные списки

13K
01 апреля 2007 года
siili
35 / / 14.10.2006
Лабораторка, в проге надо реализовать функцию которая будет удалять из связанного списка все те элементы, которые меньше последующих.
Саму функцию я написал, но она работает некоректно, помогите пожалуйста найти ошибку.

Код:
void List::Remove(){
      if (!IsEmpty()) {   // Funkcija proverajusaja pust li spisok
      Unit *CUnitPtr = FUnitPtr;
      Unit *NextUnitPtr = CUnitPtr -> NextPtr;
      Unit *DeleteUnitPtr;
      if (FUnitPtr == LUnitPtr)
     cout << "V spiske net elementov ili odin element"<< endl;
     else{
          do{          
                       if(CUnitPtr < NextUnitPtr){
                                   DeleteUnitPtr = CUnitPtr;
                                   CUnitPtr = NextUnitPtr;
                                   NextUnitPtr = NextUnitPtr -> NextPtr;
                                   delete DeleteUnitPtr;}
                       CUnitPtr = NextUnitPtr;
                       NextUnitPtr = NextUnitPtr -> NextPtr;
          }while(NextUnitPtr  != LUnitPtr);
          }
}
};


Unit - название класса
CUnitPtr - указатель на текущий элемент
FUnitPtr - указатель на первый элемент
NextUnitPt - указатель на следующий после текущего элемент
DeleteUnitPtr - Указатель на удаляемый элемент
LUnitPtr - Указатель на последний элемент
9
01 апреля 2007 года
Lerkin
3.0K / / 25.03.2003
Уточни, т.е. надо, чтобы удалялись все возрастающие последовательности?
355
01 апреля 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
ну сходу видно, что ты сравниваешь сами указатели -- т.е. адреса в памяти --, а не значения под ними.
9
01 апреля 2007 года
Lerkin
3.0K / / 25.03.2003
[QUOTE=<SCORP>;183983]ну сходу видно, что ты сравниваешь сами указатели -- т.е. адреса в памяти --, а не значения под ними.[/QUOTE]
Хе... ну, точно.
Аффтар, покажи переменные-члены класса.
13K
01 апреля 2007 года
siili
35 / / 14.10.2006
Фак, я Ахтунг!
Спасибо, уже исправляю!

Вот сам класс

Код:
class Unit{
friend class List;
  public:
      Unit(const int &x, Unit *t) {
         Elem = x;
         NextPtr = t;
      };
   private:
      int Elem;
      Unit *NextPtr;
};
13K
02 апреля 2007 года
siili
35 / / 14.10.2006
СОС снова, даже после исправления предыдущей ошибки программа работает некоректно.

Вот "исправленный" код функции:

Код:
void List::Remove(){
     
Unit *CUnitPtr = FUnitPtr;
Unit *NextUnitPtr = CUnitPtr->NextPtr;
Unit *TempPtr = NextUnitPtr;
Unit *PrevUnitPtr;  
      if (!IsEmpty()) {

          if(FUnitPtr == LUnitPtr)
           FUnitPtr = LUnitPtr = 0;
      else
// Сдесь я попытался реализовать цикл, который будет удалять узел, если он будет являться первым.
         do{
            if((CUnitPtr == FUnitPtr)&&(CUnitPtr->Elem < NextUnitPtr->Elem)){
             FUnitPtr = FUnitPtr->NextPtr;
             delete CUnitPtr;
             CUnitPtr=FUnitPtr;
            }
             }while(CUnitPtr->Elem < NextUnitPtr->Elem);
            CUnitPtr=FunitPtr->NextPtr;
            NextUnitPtr = CUnitPtr->NextPtr;
            PrevUnitPtr = FUnitPtr;      
// Место для цикла который будет проверьтя последующие элементы
// как его ревлизовать пока не догадался        
 do{
             if(CUnitPtr->Elem < NextUnitPtr->Elem);
             
             }while(CUnitPtr != LUnitPtr);

}
}
};


Класс есть выше.
Может сама ошибка в подходе к решению?
242
03 апреля 2007 года
Оlga
2.2K / / 04.02.2006
как насчёт того чтобы использовать Debuger, вместо бежать на форум со своими ошибками? также стоит учиться писать таблицы прослежевания, т.е. пройтись поэтапно самому по проге - голова вместо компилера))
13K
06 апреля 2007 года
siili
35 / / 14.10.2006
Дебагер для меня слишком сложен, но прогу я написал=))
Выкладываю саму функцию, для тех, кому интересно:

Код:
void List::RemoveNumber(){

    if(!isEmpty()){                
                   
                 
                   // Проверяем элементы                
                   Unit *CUnitPtr = FUnitPtr;
                   do{
                      Unit *TUnitPtr = CUnitPtr->NextPtr;
                      if(TUnitPtr->Elem < TUnitPtr->NextPtr->Elem)
                      {CUnitPtr->NextPtr = TUnitPtr->NextPtr;
                      if (TUnitPtr == LUnitPtr)
                      LUnitPtr = CUnitPtr;
                      delete TUnitPtr;}
                      else CUnitPtr = CUnitPtr -> NextPtr;                          
                     }while(CUnitPtr->NextPtr != LUnitPtr);
                   
                   // Проверяем первый элемент
                   Unit *NUnitPtr = FUnitPtr -> NextPtr;
                   if (FUnitPtr->Elem < NUnitPtr->Elem)
                    {Unit *CUnitPtr = FUnitPtr;
                    FUnitPtr = FUnitPtr -> NextPtr;
                    delete CUnitPtr;}
                   
                   }  
};
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог