在 C 中使用 qsort() 和结构
Using qsort() and Structs in C
对于我们的考试练习 sheet,我们必须使用河流数据创建一个结构。结构是:
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
Yangtze 6300 1800000
Mississippi-Missouri 6275 2980000
Yenisei-Angara-Selenga 5539 2580000
Yellow 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;
}
我的问题是:如何实现compare函数然后main?我知道如何打开和读取文件,但这与使用数组有什么不同吗?
一个解释会很有帮助!我不是要完整的代码。我只想要 explanation/example 我将如何做到这一点!提前致谢!
当您将文件作为 struct river 的数组保存在内存中时,比较函数将获得两个 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
}
您必须先将文件读入内存。将其存储为(未排序的)结构数组。
您可能不想对这个数组进行排序(?),因为它包含 "large data"。好的,在这种情况下它确实没有,但据我所知,识别这一点可能是作业的目的。如果对整个结构进行排序,qsort
将进行大量数据混洗。
因此,与此数组并行,您可以创建一个结构指针数组,每个指针指向未排序数组的一个结构项。
对这个指针数组应用qsort
。比较函数的形式应为
int (*compar)(const void* obj1, const void* obj2)
但请注意,由于您正在对指针数组进行排序,qsort
实际上会将 指针的地址传递给您。所以你必须做类似的事情:
const struct river* r1 = *(const struct river**)obj1;
然后以某种有意义的方式比较内容。
对于我们的考试练习 sheet,我们必须使用河流数据创建一个结构。结构是:
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
Yangtze 6300 1800000
Mississippi-Missouri 6275 2980000
Yenisei-Angara-Selenga 5539 2580000
Yellow 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;
}
我的问题是:如何实现compare函数然后main?我知道如何打开和读取文件,但这与使用数组有什么不同吗?
一个解释会很有帮助!我不是要完整的代码。我只想要 explanation/example 我将如何做到这一点!提前致谢!
当您将文件作为 struct river 的数组保存在内存中时,比较函数将获得两个 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
}
您必须先将文件读入内存。将其存储为(未排序的)结构数组。
您可能不想对这个数组进行排序(?),因为它包含 "large data"。好的,在这种情况下它确实没有,但据我所知,识别这一点可能是作业的目的。如果对整个结构进行排序,qsort
将进行大量数据混洗。
因此,与此数组并行,您可以创建一个结构指针数组,每个指针指向未排序数组的一个结构项。
对这个指针数组应用qsort
。比较函数的形式应为
int (*compar)(const void* obj1, const void* obj2)
但请注意,由于您正在对指针数组进行排序,qsort
实际上会将 指针的地址传递给您。所以你必须做类似的事情:
const struct river* r1 = *(const struct river**)obj1;
然后以某种有意义的方式比较内容。