首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的bsearch函数

C中的bsearch函数
EN

Stack Overflow用户
提问于 2010-02-19 16:23:39
回答 1查看 2.9K关注 0票数 1

如果我有两个功能:

代码语言:javascript
复制
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查找我的列表的子集。例如,如果我有两个列表:

  • (名单A) Bob,Jimmy,Lee,James,Anne
  • (名单B) Jen,Jon,Lee,James,Steph

如何在列表B中搜索以找到A中的元素?

您也可以在列表B中搜索那些不在A中的元素吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-19 16:50:52

要进行搜索,必须使用单项列表作为“bsearch()”的关键参数。

在上下文中,在a_list[n] ( b_list )中搜索条目

代码语言:javascript
复制
 void *found = bsearch(&a_list[n], b_list, b_list, b_size, Compare);

因此,要查找列表A中的列表B中的元素,请执行以下操作:

  • 排序列表B(除非您想对列表A进行排序,否则不需要对列表A排序)
  • 对于列表A中的每个元素,搜索(排序)列表B中的项。

要查找B中没有在A中的元素,您需要对列表A进行排序,然后对列表B中的每个元素进行排序,然后使用反向搜索查看元素是否在列表A中。

代码语言:javascript
复制
#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);
}

产出如下:

代码语言:javascript
复制
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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2297825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档