【问题标题】:Using qsort() and Structs in C在 C 中使用 qsort() 和结构
【发布时间】:2016-04-07 13:14:51
【问题描述】:

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

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

数据应该使用名为 data.txt 的文件从最大到最小的河流长度进行组织。该文件包含以下信息:

尼罗河 6650 334900

亚马逊 6400 6915000

长江6300 1800000

密西西比-密苏里 6275 2980000

叶尼塞-安加拉-色楞格 5539 ​​2580000

黄色5464 745000

Ob-Irtysh 5410 2990000

刚果-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;
}

我的问题是:如何实现compare函数然后main?我知道如何打开和读取文件,但这与使用数组有什么不同吗?

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

【问题讨论】:

    标签: c pointers struct qsort


    【解决方案1】:

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

    您可能不想对这个数组进行排序(?),因为它包含“大数据”。好的,在这种情况下它确实没有,但据我所知,识别这一点可能是分配的目的。如果您对整个结构进行排序,qsort 将进行大量数据混洗。

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

    在这个指针数组上应用qsort。比较函数的形式应该是

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

    但请注意,由于您正在对指针数组进行排序,qsort 实际上会将您地址传递给指针。因此,您必须执行以下操作:

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

    然后以某种有意义的方式比较内容。

    【讨论】:

      【解决方案2】:

      当您将文件作为结构河数组保存在内存中时,比较函数将两个结构河指针作为参数。所以先投那些,然后做你的比较逻辑。

      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
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多