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);
}
}
};
[C++] Связанные списки
Саму функцию я написал, но она работает некоректно, помогите пожалуйста найти ошибку.
Код:
Unit - название класса
CUnitPtr - указатель на текущий элемент
FUnitPtr - указатель на первый элемент
NextUnitPt - указатель на следующий после текущего элемент
DeleteUnitPtr - Указатель на удаляемый элемент
LUnitPtr - Указатель на последний элемент
Уточни, т.е. надо, чтобы удалялись все возрастающие последовательности?
ну сходу видно, что ты сравниваешь сами указатели -- т.е. адреса в памяти --, а не значения под ними.
Хе... ну, точно.
Аффтар, покажи переменные-члены класса.
Спасибо, уже исправляю!
Вот сам класс
Код:
class Unit{
friend class List;
public:
Unit(const int &x, Unit *t) {
Elem = x;
NextPtr = t;
};
private:
int Elem;
Unit *NextPtr;
};
friend class List;
public:
Unit(const int &x, Unit *t) {
Elem = x;
NextPtr = t;
};
private:
int Elem;
Unit *NextPtr;
};
Вот "исправленный" код функции:
Код:
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);
}
}
};
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);
}
}
};
Класс есть выше.
Может сама ошибка в подходе к решению?
как насчёт того чтобы использовать Debuger, вместо бежать на форум со своими ошибками? также стоит учиться писать таблицы прослежевания, т.е. пройтись поэтапно самому по проге - голова вместо компилера))
Выкладываю саму функцию, для тех, кому интересно:
Код:
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;}
}
};
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;}
}
};