【问题标题】:Sorting patient struct by born date按出生日期对患者结构进行排序
【发布时间】:2020-02-04 21:50:21
【问题描述】:

我有一个结构

typedef struct {
    char name[100];
    int born_date;
}patient;

我必须编写一个函数来按出生日期对这个数组进行排序。 功能看起来像 void rendez(patient patients[], int n) {} 其中 n 数字是数组长度,患者 [] 数组包含有关患者的数据。 我知道这不是一项艰巨的任务,但我仍然在学习这门语言 (C)。 我可以使用 qsort 功能,但这对我来说是新的。 我会听取所有提示并感谢您的帮助

【问题讨论】:

  • 尝试从遍历数组中的所有元素开始并打印它们。之后,您可以在 for 循环中添加额外的逻辑,以将最高/最低 Born_date 及其索引保留在内存中。
  • 欢迎来到 SO。学习是需要实践的。请向我们展示您尝试过的内容以及您遇到的问题。如果您已经找到qsort,也许您会尝试使用它并向我们展示出了什么问题。

标签: c sorting struct


【解决方案1】:

qsort 与用户定义的比较一起使用。您将需要一个辅助函数来比较 2 个项目

int compare_patient_dob(void *a, void *b)
{
    patient *pa = (patient *) a ;
    patient *pb = (patient *) b ;

    // Assuming born_dates are comparable, e.g., YYYYMMDD
    return pa->born_date - pb->born_date ;
}
...
// Later in the rendez function.
    qsort(patients, n, sizeof(patients[0], compare_patient_dob) ;

【讨论】:

  • 而这个没有qsort的任务也能完成?
  • 您可以编写自己的排序。在这种情况下,考虑实现更简单(效率较低的 sor) - 例如冒泡排序等。
  • @dash-o,你不需要转换为(patient *),最好让编译器检查正确的指针类型,而不是强制转换可以隐藏未来修改中的错误.
  • 在“C”中,运行时没有数据来验证转换。将此与 Java、C# 和其他语言进行比较,在这些语言中,对象类可以在运行时确定。如果您没有将 void * 指针显式转换为“耐心 *”,则代码将无法编译。如果把prototype中的指针改成'client *',就不会匹配qsort的prototype了。
猜你喜欢
  • 2020-10-30
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多