Axelnsk
Гость
|
|
« : 26-11-2009 11:33 » |
|
В общем , нужна функция поиска по списку по заданному номеру. (номер - это переменная в классе) .Там есть 3 варианта в начале, середине и конце. bus* List::Out(int Num1) { bus* Cur=new bus; bus* Tmp=new bus; bus* Tmp1=new bus; bus* pCurr=new bus; Cur=Start;
//поиск последнего элемента while(pCurr->GetNext()!=NULL) { pCurr = pCurr->GetNext(); }
for(; Cur->GetNext()!=NULL; Cur=Cur->GetNext()) { if(Num1==Cur->GetNext()->GetNum()) { //если в конце if(Cur->GetNext()==pCurr) { for(Cur=Start;Cur->GetNext()->GetNext()!=NULL;Cur=Cur->GetNext()); Tmp=Cur->GetNext()->GetNext(); Tmp1=Cur->GetNext()->GetNext(); Cur=Cur->GetNext(); Cur->SetNext(NULL); delete Tmp1; return Tmp;
} //если в начале else if(Cur->GetNext()==Start) { Tmp=Cur->GetNext(); Tmp1=Start; Start=Start->GetNext(); delete Tmp1; return Tmp; } //если в середине else { Tmp1=Cur->GetNext(); Tmp=Cur->GetNext(); Cur->SetNext(Tmp1->GetNext()); delete Tmp1; return Tmp; } } else { printf("NET NOMERA\n"); return NULL; } } }
В общем , не работает если переменная находится в начале, т.к. Cur->GetNext()==Start (где Cur->GetNext()-это как бы текущий элемент), значит Cur-это предыдущий, которого нет. Вот не могу понять как исправить. Cur->GetNext() брал как текуий элемент, для того что бы работало удаление из середины. и еще вопрос: если нет нужного элемента то else { printf("NET NOMERA\n"); return NULL; } возникает ошибка при попытке вернуть ноль.
|
|
« Последнее редактирование: 26-11-2009 16:51 от Sel »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #1 : 26-11-2009 11:51 » |
|
в общем не работает если переменная находится в начале
А если сначала начало проверить? возникает ошибка при попытке вернуть ноль. Где она возникает?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Вад
|
|
« Ответ #2 : 26-11-2009 11:51 » |
|
Не нашёл в твоём коде, где вообще проверяется, что элемент списка удовлетворяет условию. А, нет, стоп, нашёл В моём понимании, нет разницы при поиске в списке, где находится переменная. Просто берём и ищем, пока список не кончится. bus* cur = Start; for ( ; cur != NULL; cur = cur->GetNext() ){ if (number_to_find == cur->GetNumber()) break; } if (cur != NULL) // нашли, возвращаем
Кстати, зачем всё вот это: bus* Cur=new bus; bus* Tmp=new bus; bus* Tmp1=new bus; bus* pCurr=new bus;
?
|
|
« Последнее редактирование: 26-11-2009 11:53 от Вад »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #3 : 26-11-2009 11:54 » |
|
Кстати, зачем всё вот это? Каждая переменная должна быть проинициаллизирована! Но как?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Axelnsk
Гость
|
|
« Ответ #4 : 26-11-2009 12:00 » |
|
В моём понимании, нет разницы при поиске в списке, где находится переменная. Код: bus* cur = Start; for ( ; cur != NULL; cur = cur->GetNext() ){ if (number_to_find == cur->GetNumber()) break; } if (cur != NULL) // нашли, возвращаем Дело в том , что нужно не просто вернуть этот элемент, а еще и удал ить его из старого списка, а когда удаляеш ь есть разница , где находится элемет. Кстати, зачем всё вот это: Код: bus* Cur=new bus; bus* Tmp=new bus; bus* Tmp1=new bus; bus* pCurr=new bus; ? Насчет этого - согласен, много лишнего, мне бы сн ачала сделать , чтоб работала, а потом уже подредактирую.
|
|
« Последнее редактирование: 26-11-2009 16:52 от Sel »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #5 : 26-11-2009 12:07 » |
|
дело в том что нужно не просто вернуть этот элемент, аеще и удалть его из старого списка, а когда удаляеш есть разница где находится элемет.
Про удаление в ТЗ ничего не было Но модификация минимальная: bus* cur = Start; bus* prev = NULL; for ( ; cur != NULL; cur = cur->GetNext() ){ if (number_to_find == cur->GetNumber()) break; else prev = cur; } if (cur != NULL){ // нашли, удаляем из списка if (prev != NULL) prev->SetNext( cur->GetNext() ); else // удаляем начальный Start = cur->GetNext(); }
|
|
|
Записан
|
|
|
|
Axelnsk
Гость
|
|
« Ответ #6 : 26-11-2009 12:22 » |
|
Но модификация минимальная: Код: bus* cur = Start; bus* prev = NULL; for ( ; cur != NULL; cur = cur->GetNext() ){ if (number_to_find == cur->GetNumber()) break; else prev = cur; } if (cur != NULL){ // нашли, удаляем из списка if (prev != NULL) prev->SetNext( cur->GetNext() ); else // удаляем начальный Start = cur->GetNext(); } хм, немного не понял, но работает. спасибо возник еще один вопрос. void List::AddEnd(bus* X) {bus *Cur=new bus;
for(Cur=Start;Cur->GetNext()!=NULL;Cur=Cur->GetNext()); if(Cur==NULL) {Start=X; X->SetNext(NULL); }
else { X->SetNext(NULL); Cur->SetNext(X);} } Нужно добавить элемент в конец списка, но если список пустой ( например задается так List C;), то при попытке добавить в конец происходит ошибка. я так понимаю это из -за того что там нет элементов. е сли доб авлять в список, с уже имеющимися эле ентами, то все прекрасно работает.
|
|
« Последнее редактирование: 26-11-2009 16:47 от Sel »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #7 : 26-11-2009 12:49 » |
|
Axelnsk, не тАрАпЫсЯ но грубые ошибки в русском, заставляют думать о грубых ошибках в ПО
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Вад
|
|
« Ответ #8 : 26-11-2009 13:18 » |
|
Axelnsk, логично. Ведь у тебя в пустом списке Start нулевой, а ты присваиваешь Cur указатель на Start и пытаешься вызвать GetNext. Будет падать, потому что вызываешь метод по некорректному указателю.
|
|
|
Записан
|
|
|
|
Axelnsk
Гость
|
|
« Ответ #9 : 26-11-2009 13:52 » |
|
а как испрвить эту ошибку? мб не присваивать старту ноль?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #10 : 26-11-2009 13:54 » |
|
Тогда что ему присваивать, если список пустой? Нет, нужно просто обрабатывать отдельно случай, когда список пустой.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #11 : 26-11-2009 14:15 » |
|
Всё, что нужно сделать, это вырубить компьютер. Открыть окно. Подышать 10 минут свежим воздухом. Взять лист бумаги, карандаш и нарисовать список в виде контейнеров с адресами. И "фсё"!
Ты же не представляешь, что это такое. Тыркаешься наобум, а вдруг получится. Потрать час, другой (сложного там ничего нет), зато усвоишь списки раз и навсегда.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 26-11-2009 15:34 » |
|
я, может, что то из вапа недоглядел, но вроде товарисч за две темы ни разу код класса не показал
|
|
|
Записан
|
|
|
|
Sel
Злобный
Администратор
Offline
|
|
« Ответ #13 : 26-11-2009 16:49 » |
|
Блин, теперь и я устала. При такой безграмотности в родном русском языке какие программы ты хочешь писАть??? Уже если родной язык усвоить не можешь, куда ж в программирование-то???
|
|
|
Записан
|
Слово не воробей. Всё не воробей, кроме воробья.
|
|
|
Axelnsk
Гость
|
|
« Ответ #14 : 27-11-2009 10:11 » |
|
void List::Add(bus* X) { if(Start==NULL) { Start=X; } else { X->SetNext(Start); Start=X; } } Эта Функция добавляет в начало. Все ворде бы работает, но при попытке распечатать этот список, он сначала распечатывает, а потом вылетает ошибка: Unhandled exception at 0x004011e8 in autobus.exe: 0xC0000005: Access violation reading location 0xccccccd4. Что можно сделать?
|
|
« Последнее редактирование: 27-11-2009 10:17 от Алексей1153++ »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #15 : 27-11-2009 10:13 » |
|
А при создании нового bus у него указатель на следующий элемент обнуляется?
|
|
|
Записан
|
|
|
|
Axelnsk
Гость
|
|
« Ответ #16 : 27-11-2009 10:18 » |
|
А при создании нового bus у него указатель на следующий элемент обнуляется?
да, при создании элемента bus, Next=NULL.
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #17 : 27-11-2009 10:25 » |
|
Покажи код печати списка. Но, вообще, для таких вещей есть отладчик, чтобы пройти пошагово и посмотреть, что именно происходит не так.
|
|
|
Записан
|
|
|
|
Axelnsk
Гость
|
|
« Ответ #18 : 27-11-2009 10:26 » |
|
void List::PrintList(void) {bus* Cur; Cur=Start; while(Cur) { Cur->Print(); Cur = Cur->GetNext(); } }
void bus::Print(void) {printf(" -> %i %s %i\n",Num, Fio, mars); }
|
|
|
Записан
|
|
|
|
Axelnsk
Гость
|
|
« Ответ #19 : 28-11-2009 07:32 » |
|
все, решил проблему)
|
|
|
Записан
|
|
|
|
|