在C中使用qsort()和Structs

时间:2016-04-07 13:14:52

标签: c pointers struct qsort

对于我们的考试练习表,我们必须使用河流数据创建结构。结构是:

struct river
{
    char name[40]; //name of river max 40 char long
    int length; 
    int drainage_area;
}

应该使用名为data.txt的文件将数据从最大到最小的河段组织起来。该文件包含以下信息:

  

Nile 6650 334900

     

Amazon 6400 6915000

     

扬子江6300 1800000

     

Mississippi-Missouri 6275 2980000

     

Yenisei-Angara-Selenga 5539 ​​2580000

     

黄色5464 745000

     

Ob-Irtysh 5410 2990000

     

Congo-Chambeshi 4700 3680000

所以我知道使用函数qsort(),你需要一个比较函数。但是,当涉及到文件时,我不太确定如何执行此操作。我有以下比较功能(一般比较功能):

int compare_rivers(void *r1, void *r2)
{
    int *_r1 = (int *)r1;
    int *_r2 = (int *)r2;

    if( *_r1 > *_r2)
    {
        return -1;
    }
    if (*_r1 == *_r2)
    {
        return 0;
    }

    return 1;
}

我的问题是:如何实现比较功能然后主要?我知道如何打开和读取文件,但这与使用数组不同吗?

解释会非常有用!我不是要求一个完整的代码。我只想要一个解释/示例我将如何做到这一点!提前致谢!

2 个答案:

答案 0 :(得分:4)

您必须先将文件读入内存。将其存储为(未排序)结构数组。

您可能不希望对此数组(?)进行排序,因为它包含“大数据”。好吧,在这种情况下,它确实没有,但是对于所有我知道,分配的目的可能是认识到这一点。如果你对整个结构进行排序,qsort会做很多数据改组。

因此,与此数组并行,您可以创建一个struct指针数组,每个指针都指向未排序数组的结构项。

在这个指针数组上应用qsort。比较函数应具有

形式
int (*compar)(const void* obj1, const void* obj2)

但请注意,由于您要对指针数组进行排序,qsort实际上会将地址传递给指针。所以你必须做类似的事情:

  const struct river* r1 = *(const struct river**)obj1;

然后以一些有意义的方式比较内容。

答案 1 :(得分:2)

当你将文件作为struct river数组保存在内存中时,compare函数会获得两个struct river指针作为参数。首先抛出那些,然后做你的比较逻辑。

struct river rivers[10]; // filled with the file

qsort(rivers, 10, sizeof *rivers, compare_rivers);

    int compare_rivers(const void *r1, const void *r2)
    {
        const struct river*_r1 = (const struct river *)r1;
        const struct river*_r2 = (const struct river*)r2;

        // do compare logic
    }