收录日期:2021/01/17 15:06:21 时间:2016/08/28 06:42:40 标签:C语言
c 语言 struct bsearch

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int (*compfn)(const void*, const void*);

struct date
{
    char m[10]; /**< January 等等 */
    int  d;     /**< 日 1 2 3 4 5 6.。。。。。 */
int  y;     /**< 年 90-99 00-12 */
};


int cmp_month(const char *m1, const char *m2)
{
    int i, n, n1, n2;
    static const char *months[] = {
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
    };

    n = sizeof(months) / sizeof(months[0]);
    n1 = n2 = -1;
    for (i = 0; i < n; ++i) {
        if (n1 < 0 && strcmp(m1, months[i]) == 0)
            n1 = i;
        if (n2 < 0 && strcmp(m2, months[i]) == 0)
            n2 = i;
        if (n1 >= 0 && n2 >= 0)
            break;
    }

    return n1 - n2;
}


int cmp_year(const void *v1, const void *v2)
{
    int temp;
    const struct date *y1, *y2;
 
    y1 = (const struct date *)v1;
    y2 = (const struct date *)v2;

 
    if ((temp = (y1->y != y2->y)) != 0) {
        if (y1->y >= 70 && y2->y >= 70)
            return y1->y - y2->y;
        if (y1->y >= 70 && y2->y <  70)
            return -1;
        if (y1->y <  70 && y2->y <  70)
            return y1->y - y2->y;
        if (y1->y <  70 && y2->y >= 70)
            return +1;
    }
}


int cmp_day(const void *v1, const void *v2)
{
const struct date *d1, *d2;
d1 = (const struct date *)v1;
    d2 = (const struct date *)v2;

return d1->d - d2->d;
}

int main(int argc, char *argv[])
{
    int i, n,;
            struct date date[] = {
{"January", 1, 01},
{"January", 1, 00},
{"February", 28, 99},
{"July", 17, 12},
{"September", 10, 12},
{"July", 1,00},
{"June", 30, 90},
{"August", 25, 06},
{"May", 27, 07},
{"October", 1, 03},
    };
 
    n = sizeof(date) / sizeof(date[0]);

qsort(date, n, sizeof(struct date), &cmp_day);
        qsort(date, n, sizeof(struct date), (compfn)cmp_month);
qsort(date, n, sizeof(struct date), &cmp_year);

    for (i = 0; i < n; ++i)
        printf("%s %d %02d\n", date[i].m, date[i].d, date[i].y);


    return 0;
}


如何使用bsearch()查找 January 01 01 是否在date里面?
qsort不是稳定排序,所以连你这三句qsort都达不到你想要的效果。
你之前那帖不是有人给了正确的方法了,为什么非要用这种奇怪的方
楼主没有理解前面的哪个帖子?
仔细查看了一下2楼的代码, 57行有错误!
    if ((ret = (d1->y != d2->y)) != 0) {

改为
    if ((ret = (d1->y - d2->y)) != 0) {

下面的代码加上了bsearch
[code]
/**
 * @file    datesort.c
 * @brief   
 */

struct date
{
    char m[20]; /**< January 等等 */
    int  d;     /**< 日 1 2 3 4 5 6.。。。。。 */
    int  y;     /**< 年 90-99 00-12 */
};

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp_month(const char *m1, const char *m2)
{
    int i, n, n1, n2;
    static const char *months[] = {
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
    };

    n = sizeof(months) / sizeof(months[0]);
    n1 = n2 = -1;
    for (i = 0; i < n; ++i) {
        if (n1 < 0 && strcmp(m1, months[i]) == 0)
            n1 = i;
        if (n2 < 0 && strcmp(m2, months[i]) == 0)
            n2 = i;
        if (n1 >= 0 && n2 >= 0)
            break;
    }

    return n1 - n2;
}

int cmp_date(const void *v1, const void *v2)
{
    int ret;
    const struct date *d1, *d2;

    d1 = (const struct date *)v1;
    d2 = (const struct date *)v2;

    if ((ret = (d1->y - d2->y)) != 0) {
        if (d1->y >= 70 && d2->y >= 70)
            return ret;
        if (d1->y >= 70 && d2->y <  70)
            return -1;
        if (d1->y <  70 && d2->y <  70)
            return ret;
        if (d1->y <  70 && d2->y >= 70)
            return +1;
    }
    
    if ((ret = cmp_month(d1->m, d2->m)) != 0)
        return ret;

    return d1->d - d2->d;
}

int main(int argc, char *argv[])
{
    int i, n;

    struct date *ptr;
    struct date key = {"January", 01, 01};
    struct date date[] = {
        {"January", 1, 01},
        {"January", 1, 00},
        {"February", 28, 99},
        {"July", 17, 12},
        {"September", 10, 12},
        {"July", 1,00},
        {"June", 30, 90},
        {"August", 25, 06},
        {"May", 27, 07},
        {"October", 1, 03},
    };

    n = sizeof(date) / sizeof(date[0]);
    qsort(date, n, sizeof(struct date), &cmp_date);

    for (i = 0; i < n; ++i)
        printf("%s %d %d\n", date[i].m, date[i].d, date[i].y);

    ptr = bsearch(&key, date, n, sizeof(struct date), &cmp_date);
    if (ptr != NULL) {
        printf("\n");
        printf("date[%d]:\n", (int)(ptr - date));
        printf("%s %d %d\n", ptr->m, ptr->d, ptr->y);
    }
    return 0;
}
[/code]
楼主没有理解前面的哪个帖子?
仔细查看了一下2楼的代码, 57行有错误!
    if ((ret = (d1->y != d2->y)) != 0) {

改为
    if ((ret = (d1->y - d2->y)) != 0) {

下面的代码加上了bsearch

/**
 * @file    datesort.c
 * @brief   
 */

struct date
{
    char m[20]; /**< January 等等 */
    int  d;     /**< 日 1 2 3 4 5 6.。。。。。 */
    int  y;     /**< 年 90-99 00-12 */
};

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp_month(const char *m1, const char *m2)
{
    int i, n, n1, n2;
    static const char *months[] = {
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
    };

    n = sizeof(months) / sizeof(months[0]);
    n1 = n2 = -1;
    for (i = 0; i < n; ++i) {
        if (n1 < 0 && strcmp(m1, months[i]) == 0)
            n1 = i;
        if (n2 < 0 && strcmp(m2, months[i]) == 0)
            n2 = i;
        if (n1 >= 0 && n2 >= 0)
            break;
    }

    return n1 - n2;
}

int cmp_date(const void *v1, const void *v2)
{
    int ret;
    const struct date *d1, *d2;

    d1 = (const struct date *)v1;
    d2 = (const struct date *)v2;

    if ((ret = (d1->y - d2->y)) != 0) {
        if (d1->y >= 70 && d2->y >= 70)
            return ret;
        if (d1->y >= 70 && d2->y <  70)
            return -1;
        if (d1->y <  70 && d2->y <  70)
            return ret;
        if (d1->y <  70 && d2->y >= 70)
            return +1;
    }
    
    if ((ret = cmp_month(d1->m, d2->m)) != 0)
        return ret;

    return d1->d - d2->d;
}

int main(int argc, char *argv[])
{
    int i, n;

    struct date *ptr;
    struct date key = {"January", 01, 01};
    struct date date[] = {
        {"January", 1, 01},
        {"January", 1, 00},
        {"February", 28, 99},
        {"July", 17, 12},
        {"September", 10, 12},
        {"July", 1,00},
        {"June", 30, 90},
        {"August", 25, 06},
        {"May", 27, 07},
        {"October", 1, 03},
    };

    n = sizeof(date) / sizeof(date[0]);
    qsort(date, n, sizeof(struct date), &cmp_date);

    for (i = 0; i < n; ++i)
        printf("%s %d %d\n", date[i].m, date[i].d, date[i].y);

    ptr = bsearch(&key, date, n, sizeof(struct date), &cmp_date);
    if (ptr != NULL) {
        printf("\n");
        printf("date[%d]:\n", (int)(ptr - date));
        printf("%s %d %d\n", ptr->m, ptr->d, ptr->y);
    }
    return 0;
}
引用 2 楼 rocktyt2 的回复:
你之前那帖不是有人给了正确的方法了,为什么非要用这种奇怪的方

作业要求,我也没辙
引用 4 楼 mymtom 的回复:
楼主没有理解前面的哪个帖子?
仔细查看了一下2楼的代码, 57行有错误!
C/C++ code?1    if ((ret = (d1->y != d2->y)) != 0) {
改为
C/C++ code?1    if ((ret = (d1->y - d2->y)) != 0) {
下面的代码加上了bsearch
C/C++ code?123456789……

感激不尽,泪牛满面

一个很奇怪的问题【急】 CLayeredBitmapCtrl的使用,关于控件 绑定数据岛的表格鼠标响应问题 「100分」菜鸟提问:为什么要在linux环境下编程? cisco培训 direct show在两路码流叠加时,如何实时替换第二路码流 GridView 后台动态生成 HyperLinkField 组合数算法 asp.net 新闻发布。生成的静态网页,新闻内容分页? ACCESS日期格式问题,用C#语言 插入到access数据库中 TextChanged事件和数据库数据修改的问题~ asp.net连接数据库! IE控件与HTMLVIEW的区别 tomcat6.0报错 有没有人用过OUTLOOK的ItemRemove这个事情 使用struts2标签的疑问 MFC中怎么把CString与char数组互换? 跪求TLC5620的protel元件库 如何用ACCESS的VBA代码中复制数据库存储的图片(链接状态)到剪贴板 用swing的JTable怎么将数据库中的数据动态生成到表格中 一个月加班50多个小时,是啥概念? 这种情况开多少合适 下面的外部函数为何调用出错呢 php开发,请问大家商城图片是如何解决? 求助!!!web服务扩展找不到。和 也找不到。 Android开发之DDMS调试 由于出现被放弃的mutex,等待过程结束 怎么上传正在使用的文件 初学者,问最后x的值的问题。谢谢帮忙 大家帮忙看看查询问题!急!!!