繁体   English   中英

为qsort编写比较函数

[英]Writing a comparision function for qsort

我正在编写一个比较函数,该函数通过按姓氏的升序来比较和组织名称,如果两个姓氏相同,则按名字的降序进行比较。 我现在拥有的功能不会这样做。

这是函数:

int namecmp(const void *p, const void *q)
{
    const name *pp = p;
    const name *qq = q;
    int n;

    if((n = strcmp(pp->last, qq->last)) != 0)
        return n;

    return qq->first - pp->first;
}

我正在尝试组织动态结构数组,这是我的结构。

typedef struct
{
char last[NAMESIZE];
char first[NAMESIZE];
}name;

typedef struct
{
int id;
name name;
float score;
}record;

typedef struct {
record *data; /* the dynamic array */
size_t nalloc; /* number of records allocated */
size_t nused; /* number of records in use */
} record_list;

这就是qsort的调用方式。

qsort(list->data, list->nused, sizeof(list->data[0]), namecmp);

任何帮助,将不胜感激。

编辑:我做了你的建议,现在我有错误的输出。

我的输出是:

3456789 Burns, Monty: 100.00
4567890 Simpson, Lisa: 95.00
1234567 Simpson, Homer: 35.50
6666666 Simpson, Bart: 45.00
2345678 Flanders, Ned: 99.50

编辑2:

我如何将字符串存储到结构中。

            if(sscanf(line,"%s", lastname) == 1)
        {

            if(strlen(lastname) < NAMESIZE)
            {
                lastname[0] = toupper((int)lastname[0]);
                strcpy(rec->name.last, lastname);
                break;
            }
        }

您还需要使用名字调用strcmp,否则将无法正常工作(因为这只是减去内存中的地址)。 将最后一行更改为

return strcmp(pp->first, qq->first);

比较功能具有两个比较(已编辑一次),但顺序不同。 首先具有strcmp(p,q),而return语句具有strcmp(q,p)。 使它们相同,它将起作用!

词shash

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM