我正在使用结构数组来存储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");
}
答案 0 :(得分:1)
通常,您使用相同的功能进行排序和搜索-它可以确保搜索使用与排序相同的条件。
bsearch()
和qsort()
之间的区别在于将参数传递给比较器的方式,有时您可以利用这种区别。例如,您可能没有完全填充的结构作为要传递给搜索的键,但是用于对数据进行排序的字段也应该出现在键中。
在您有需要这种恶作剧的具体用例之前,请使用相同的比较器进行排序和搜索。
答案 1 :(得分:1)
对bsearch()
和qsort()
使用相同的比较功能,但是请记住key
的{{1}}应该与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()
。
答案 2 :(得分:0)
The Man Page for bsearch
提供了一个不错的例子。 qsort
和bsearch
必须使用相同的比较函数,因为bsearch
假定一个已排序的列表,并使用其比较函数来确定其迭代搜索过程中下一个搜索的方向。
乍看之下,我认为您不需要重新定义比较功能。 compare
和qsort
都应该使用bsearch
,实际上,如果bsearch
要使用以下功能,这些功能必须等效成功搜索qsort
订购的商品。
答案 3 :(得分:0)
代码可以通过首先形成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);