Функция поиска и структура в C - PullRequest
0 голосов
/ 17 октября 2018

Я использую массив структур для хранения информации n студентов.Этот массив структур сначала сортируется с использованием функции qsort (), а затем выполняется поиск номера броска в отсортированном массиве структур с использованием функции bsearch ().Какой код я должен написать для функции сравнения bsearch ()?

Исходный код:

#include<stdio.h>
#define SIZE 15

// search for a structure in array of structures using qsort() and bsearch()

struct student{
    int id;
    char name[30];
}S[SIZE];

int compare(const void* S, const void* T){
    int id1 = ((struct student *)S) -> id;
    int id2 = ((struct student *)T) -> id;

    return id1 - id2;
}

struct student comapre1(const void* S, const void* T){
    // what code should i include here
}

void main(){
    int size, i;
    printf("How many students are there ?: ");
    scanf("%d", &size);
    printf("----------------------------------------------------------\n");

    for(i = 0 ; i < size ; i++){
        printf("Student %d\nEnter roll number: ",i+1);
        scanf("%d", &S[i].id);
        while(getchar() != '\n');
        printf("Enter name: ");
        gets(S[i].name);
        printf("----------------------------------------------------------\n");
    }

    qsort(S, SIZE, sizeof(struct student), compare);        // sorting array of structues

    int key;    // roll number to be searched

    printf("Enter roll number whose record wants to be searched: ");
    scanf("%d", &key);

    struct student *res = bsearch(&key, S, SIZE, sizeof(struct student), compare1);

    if(res != NULL){    
        // display name and id of record found
    }else
        printf("not found");
}

Ответы [ 4 ]

0 голосов
/ 17 октября 2018

Код может использовать ту же функцию сравнения, что и в qsort(), сначала сформировав struct student и использовать его .id член.

struct student dummy;
dummy.id = key;
struct student *res = bsearch(&dummy, S, SIZE, sizeof S[0], compare1);

В качестве альтернативы код может использовать другое сравнениеи используйте int key напрямую.

int bsearch_compare(const void* key_ptr, const void* element_ptr){
  int id1 = *((const int *)key_ptr);
  int id2 = ((const struct student *)element_ptr)->id;
  return id1 - id2;
}

struct student *res = bsearch(&key, S, SIZE, sizeof S[0], bsearch_compare);

Для корректной работы всего диапазона int измените обе функции сравнения:

  // return id1 - id2;
  return (id1 > id2) - (id1 < id2);
0 голосов
/ 17 октября 2018

Обычно вы используете одну и ту же функцию для сортировки и поиска - она ​​гарантирует, что поиск использует те же критерии, что и сортировка.

Существуют различия между bsearch() и qsort() в том, как аргументы передаются в компаратор, и иногда вы можете использовать разницу.Например, у вас может не быть полностью заполненной структуры для передачи в качестве ключа для поиска, но поля, используемые для сортировки данных, также должны присутствовать в ключе.

Пока у вас нет конкретного варианта использования, которыйтребует таких махинаций, используйте один и тот же компаратор для сортировки и поиска.

0 голосов
/ 17 октября 2018

Используйте одну и ту же функцию сравнения для bsearch() и qsort(), но помните, что key для bsearch() должно быть равно struct student.Таким образом, ваш код будет выглядеть так:

struct student student_key;    // roll number to be searched

printf("Enter roll number whose record wants to be searched: ");
scanf("%d", &(student_key.id));

struct student *res = (struct student *)bsearch(&student_key, S, size, sizeof(struct student), compare);

и последнее. Никогда не используйте gets().Всегда используйте fgets() как минимум.

0 голосов
/ 17 октября 2018

Справочная страница для bsearch дает достойный пример.Вы должны использовать одну и ту же функцию сравнения для qsort и bsearch, поскольку bsearch предполагает отсортированный список и использует свою функцию сравнения для определения направления следующего поиска в процессе итеративного поиска.

На первый взгляд, я не думаю, что вам нужно переопределять функцию сравнения.Вы должны быть в состоянии использовать compare как для qsort, так и для bsearch, и на самом деле эти функции должны быть эквивалентными, если bsearch собирается успешно найти то, что заказано qsort.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...