C语言中查找数组中的元素(WIN)

 通常把qsort与bsearch结合起来使用。

 

  1. qsort

    qsort的函数声明如下:
    void qsort(void *base, size_t num, size_t width, int(*comp)(const void *, const void *));

    参数说明如下:

    base: 要排序的数组
    num: 数组中的元素数目
    width: 每个数组元素占用内存空间,可使用sizeof获得
               如果数组元素为整数,此为sizeof(int)
               如果数组元素为字符串,此为sizeof(char*)
               如果数组元素为结构体car,此为sizeof(car)
    comp: 比较两个数组元素的比较函数。本比较函数的第一个参数值小于、等于、大于第二参数值时,本比较函数的返回值应分别小于、等于、大于零。

    注意:这个函数只能将base中的元素升序排列

    下面给出几个常用的comp函数(最后一个参数)的例子

    ●数组元素为整数
    int comp(const void *a,const void *b) { return *(int *)a-*(int *)b; }

    ●数组元素为字符串
    int comp(const void *a,const void *b { return strcmp((char *)a,(char *)b); }

    ●数组元素为结构体
    typedef struct str { char str1[11]; char str2[11]; }str,*stri; str strin[100001]={0}; int compare(const void *a,const void *b) { return strcmp( ((str*)a)->str2 , ((str*)b)->str2 ); }
  2. bsearch

    qsort的函数声明如下:
    void *bsearch(const void *key, const void *base, size_t *nelem,  size_t width, int(*fcmp)(const void *, const *));

    参数的意思和qsort的差不多,区别在于:
    1. qsort用来排序,bsearch用二分法来查找元素
    2. bsearch中的base必须是升序排列的数组
    3. 如果数组里有重复的答案,则bsearch会返回其中一个的地址 (具体返回哪一个不确定)
    4. bsearch有五个自变量,第一个是要找的东西,剩下的跟qsort一模一样
    5. bsearch如果没找到所求则回传NULL ,否则回传该元素被找到的地址(void *)
  3. 使用示例

    ●判断数组中是否存在指定的字符串
    #include #include #include #define size_of_ary(ary) sizeof(ary)/sizeof(*ary) int SearchComp(const void *, const void *); int main(void) { char *units[4] = {"KB", "MB", "GB", "TB"}; char *key; char **res; key = "GB"; qsort(units, size_of_ary(units), sizeof(char*), comp); res = (char **)bsearch(&key, units, size_of_ary(units), sizeof(char*), SearchComp); if (res) { printf("I found %s/n", *res); } else { puts("Not found"); } return EXIT_SUCCESS; } int SearchComp(const void *p1, const void *p2) { return strcmp((char *)p1,(char *)p2); }

    ●以电话号码为关键字,查找所属人信息
      (真正做的时候也许关键字key为(char*)类型会更加直观,但这里只是作个例子,说明参数如何设置。)
    #include #include #include struct person { char last[16]; char first[11]; char phone[13]; int age; }; static int comp(const void*, const void*); int main() { struct person *p; static struct person key= { "", "", "555-1965", 0 }; static struct person people[] = { { "ford", "henry", "555-1903", 98 }, { "lincoln", "abraham", "555-1865", 161 }, { "ford", "edsel", "555-1965", 53 }, { "trump", "donald", "555-1988", 49 } }; //排序 qsort(people, 4, sizeof people[0], comp); //查找 p=(struct person *)bsearch(&key, people, 4, sizeof people[0], comp); if (p != NULL) { printf("%s,%s,%s,%d/n", p->last, p->first, p->phone, p->age); } else puts("Not found"); return 0; } /*比较函数,关键值是电话号码字段*/ static int comp(const void *x, const void *y) { struct person *p1=(struct person *)x; struct person *p2=(struct person *)y; return strcmp(p1->phone, p2->phone); }

 

 

你可能感兴趣的:(C语言)