Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++] Поиск по списку  (Прочитано 19696 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
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 » Записан
Джон
просто
Администратор

de
Offline 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."
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 от Вад » Записан
Джон
просто
Администратор

de
Offline 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 » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 26-11-2009 12:49 » 

Axelnsk, не тАрАпЫсЯ
но грубые ошибки в русском, заставляют думать о грубых ошибках  в ПО
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 26-11-2009 13:18 » 

Axelnsk, логично. Ведь у тебя в пустом списке Start нулевой, а ты присваиваешь Cur указатель на Start и пытаешься вызвать GetNext. Будет падать, потому что вызываешь метод по некорректному указателю.
Записан
Axelnsk
Гость
« Ответ #9 : 26-11-2009 13:52 » 

а как испрвить эту ошибку?
мб не присваивать старту ноль?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 26-11-2009 13:54 » 

Тогда что ему присваивать, если список пустой? Улыбаюсь Нет, нужно просто обрабатывать отдельно случай, когда список пустой.
Записан
Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 26-11-2009 15:34 » 

я, может, что то из вапа недоглядел, но вроде товарисч за две темы ни разу код класса не показал Улыбаюсь
Записан

Sel
Злобный
Администратор

ru
Offline 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++ » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 27-11-2009 10:13 » 

А при создании нового bus у него указатель на следующий элемент обнуляется?
Записан
Axelnsk
Гость
« Ответ #16 : 27-11-2009 10:18 » 

А при создании нового bus у него указатель на следующий элемент обнуляется?
да, при создании элемента bus, Next=NULL.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 » 

все, решил проблему)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines