#c #search #data-structures #queue
#c #Поиск #структуры данных #очередь
Вопрос:
Предположим, если я введу данные 5 пассажиров, я смогу получить данные только первого пассажира, даже если я буду искать данные 4-го пассажира.Мне нужно найти любой элемент в списке.If current= frontq; при поиске отображается первый элемент.
код:
int search()
{ struct bag *next;
char *n,*f;
current=frontq;
printf("Enter name to be searched:n");
scanf("%s",amp;n);
printf("nEnter the flight numbern");
scanf("%s",amp;f);
while((current->name==n)amp;amp;(current->fl_no==f))
{
current=current->next;
next ;
}
printf ("n The Searched luggage isn");
printf("%sn",current->name);
printf("%sn",current->dest);
printf("%sn",current->fl_no);
return 0;
}
Комментарии:
1. Время научиться использовать отладчик для пошагового выполнения кода оператор за оператором при мониторинге переменных и их значений. Для таких вещей, как списки, также полезно использовать ручку и бумагу для рисования списка, указателей и выполняемых операций.
2. ‘current->name==n’ ….. Google или man ‘strcmp’.
3. И, кажется, вы спали, когда ваш учитель учил
scanf
и как им пользоваться. Или вы просто пропустили самые ранние главы своей книги или руководства для начинающих.4. «Я могу получить только данные первого пассажира»… Я подозреваю, что ваш список все равно заблокирован, хотя это может быть какой-то артефакт UB scanf / pointer, отмеченный @Someprogrammerdude
Ответ №1:
Не уверен, что содержит структура очереди, но предполагаю некоторые вещи….
Вы сравниваете указатели имен, а не содержимое имени current->name==n
— используйте функцию strcmp.
Кроме того, scanf считывает запрос на имя в ссылки на память по n, который не назначен — вам нужно объявить буфер:
char n[100];
И scanf scanf("%s",n);
не должно быть scanf("%s",amp;n);
Комментарии:
1. Спасибо! Это определенно помогло мне!
Ответ №2:
Для начала эти указатели
char *n,*f;
не инициализируются и имеют неопределенные значения.
И эти вызовы scanf
scanf("%s",amp;n);
scanf("%s",amp;f);
используйте неправильные аргументы и в результате вызывайте неопределенное поведение.
Вам нужно объявить массивы соответствующих размеров, например
char n[N], f[N];
где N — некоторые значения и, по крайней мере, в вызовах scanf для записи
scanf( "%s", n);
scanf( "%s", f);
Также в состоянии цикла while, который записан неправильно, сравниваются указатели
while((current->name==n)amp;amp;(current->fl_no==f))
вы должны написать
while( current != NULL amp;amp;
!( strcmp( current->name, n ) == 0 amp;amp; strcmp( current->fl_no, f ) == 0 ) )
И после цикла вы должны написать
if ( current != NULL )
{
printf ("n The Searched luggage isn");
printf("%sn",current->name);
printf("%sn",current->dest);
printf("%sn",current->fl_no);
}
Кроме того, возвращаемое значение функции не имеет смысла. Лучше написать возвращаемое выражение следующим образом
return current != NULL;
В этом случае пользователь функции может проверить, был ли найден требуемый элемент очереди или нет.
Комментарии:
1. Спасибо! Это определенно помогло мне!