سؤال
إذا كان لدي وظيفتان:
void SortStudents(char *studentList[], size_t studentCount)
{
qsort(studentList, sizeof(studentList)/sizeof(studentList[0]), sizeof(studentList[0]), Compare);
}
int Compare(const void *a, const void *b)
{
return (strcmp(*(char **)a, *(char **)b));
}
هذا النوع ومقارنة باستخدام وظيفة QSort ، كيف يمكنني استخدام BSearch للعثور على مجموعات فرعية من قائمتي. على سبيل المثال ، إذا كان لدي قائمتان:
- (القائمة أ) بوب ، جيمي ، لي ، جيمس ، آن
- (القائمة ب) جين ، جون ، لي ، جيمس ، ستيف
كيف يمكنني البحث في القائمة ب للعثور على تلك العناصر في أ؟
هل يمكنك أيضًا إجراء بحث في القائمة B للعثور على تلك العناصر ليس في A؟
شكرًا.
المحلول
لإجراء بحث ، يجب عليك استخدام قائمة عنصر واحد كمعلمة رئيسية لـ "BSearch ()".
في السياق ، والبحث عن الدخول في a_list[n]
في b_list
:
void *found = bsearch(&a_list[n], b_list, b_list, b_size, Compare);
لذلك ، للعثور على العناصر الموجودة في القائمة B الموجودة في القائمة A ، ستفعل:
- فرز القائمة B (لا تحتاج إلى فرز القائمة A لهذا الجزء من التمرين إلا إذا كنت ترغب في ذلك)
- لكل عنصر في القائمة أ ، ابحث عن العنصر في القائمة (المرتبة) ب.
ولإيجاد العناصر الموجودة في B التي ليست في A ، ستحتاج إلى فرز القائمة A بعد كل شيء ومن ثم لكل عنصر في القائمة B ، راجع ما إذا كان العنصر في قائمة A باستخدام البحث المعاكس.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char *a_list[] = { "Bob", "Jimmy", "Lee", "James", "Anne" };
static char *b_list[] = { "Jen", "Jon", "Lee", "James", "Steph" };
static size_t a_number = sizeof(a_list)/sizeof(a_list[0]);
static size_t b_number = sizeof(b_list)/sizeof(b_list[0]);
static int Compare(const void *a, const void *b)
{
return (strcmp(*(char **)a, *(char **)b));
}
void SortStudents(char *studentList[], size_t studentCount)
{
qsort(studentList, studentCount, sizeof(studentList[0]), Compare);
}
static void dump_list(const char *tag, char **list, size_t number)
{
size_t i;
printf("%s:\n", tag);
for (i = 0; i < number; i++)
printf(" %s%s", list[i], (i == number - 1) ? "" : ",");
putchar('\n');
}
static char *search_list(char *name, char **list, size_t number)
{
char **found = bsearch(&name, list, number, sizeof(*list), Compare);
return((found == 0) ? 0 : *found);
}
static void names_in_list(char **find_list, size_t find_number, char **name_list, size_t name_number)
{
size_t i;
for (i = 0; i < find_number; i++)
{
char *name = search_list(find_list[i], name_list, name_number);
if (name != 0)
printf("Found %s in list at %s\n", find_list[i], name);
}
}
static void names_not_in_list(char **find_list, size_t find_number, char **name_list, size_t name_number)
{
size_t i;
for (i = 0; i < find_number; i++)
{
char *name = search_list(find_list[i], name_list, name_number);
if (name == 0)
printf("Did not find %s in list\n", find_list[i]);
}
}
int main(void)
{
dump_list("Unsorted A list", a_list, a_number);
dump_list("Unsorted B list", b_list, b_number);
SortStudents(a_list, a_number);
SortStudents(b_list, b_number);
dump_list("Sorted A list", a_list, a_number);
dump_list("Sorted B list", b_list, b_number);
dump_list("Searching in B list for people in A list", b_list, b_number);
names_in_list(a_list, a_number, b_list, b_number);
dump_list("Searching in A list for people not in B list", a_list, a_number);
names_not_in_list(b_list, b_number, a_list, a_number);
return(0);
}
وكان الناتج:
Unsorted A list:
Bob, Jimmy, Lee, James, Anne
Unsorted B list:
Jen, Jon, Lee, James, Steph
Sorted A list:
Anne, Bob, James, Jimmy, Lee
Sorted B list:
James, Jen, Jon, Lee, Steph
Searching in B list for people in A list:
James, Jen, Jon, Lee, Steph
Found James in list at James
Found Lee in list at Lee
Searching in A list for people not in B list:
Anne, Bob, James, Jimmy, Lee
Did not find Jen in list
Did not find Jon in list
Did not find Steph in list
لا تنتمي إلى StackOverflow