【问题标题】:Sort Struct records对结构记录进行排序
【发布时间】:2015-10-04 00:15:44
【问题描述】:

我有一个包含学生姓名字段的结构。我想按字母顺序排列名称。以下是存储在结构的名称字段中的名称列表:

Thui Bhu
Ariana B. Smith
Emily Gonzales
Jennifer L
Maria Jones
Bill Gates
Escobar Morris
Anne Latner

这是我定义结构的方式:

struct studentData {
        char name[30];
        int quiz1; int quiz2;
        int quiz3; int quiz4;
        int mid1; int mid2;
        int finalexam;
    } ;

这是我尝试用来排序的代码:

void SortNames(struct studentData *record, int reccount)
{
    int j,i;
    struct studentData temp;
    for(i = 1; i < reccount; i++)
    {
        j = i - 1;
        while( j >= 0 && strcmp( record[j+1].name, record[j].name) < 0 )
        {
            temp =  record[j + 1]; /*errors*/
            record[j+1] = record[j];
            record[j] = temp; /*errors*/
            j--;
        }
        printf("%s",record[j].name);
    }
   return;
}

这是我得到的输出:

Ariana B. SmithEmily GonzalesJennifer LAriana B. SmithEmily Gonzales

请帮忙!我愿意使用任何内置函数。

【问题讨论】:

    标签: c sorting struct


    【解决方案1】:

    致电qsort()。

    #include <stdlib.h>
    #include <string.h>
    int cmp(const void *l, const void *r)
    {
        return strcmp(((struct studentData*)l)->name, ((struct studentData*)r)->name);
    }
    
    void SortNames(struct studentData *record, int reccount)
    {
        int i;
        qsort(record, reccount, sizeof(struct studentData), cmp);
        for (i = 0; i < reccount; ++i) {
            printf("%s\n", record[i].name);
        }
    }
    

    【讨论】:

    • 2 个问题:1) 我是否在 main 中声明 int cmp() 函数? 2) 如果我想对所有其他记录字段进行排序以匹配名称的顺序怎么办?
    • 1.在SortNames()之前,在任何函数之外声明并实现它; 2.排序时整个struct一起移动,所以其他字段已经匹配了。
    【解决方案2】:

    除非您需要创建自己的排序例程,否则最好的方法可能是使用qsort 函数按name 对结构进行排序。使用qsort 时,您的任务只是创建一个比较器函数,该函数将void 指针指向struct studentData 类型,并创建一种由感兴趣的成员进行比较的方法(此处为name)

    qsort 比较函数返回 int 类型。对于您的结构,它看起来像:

    /* qsort struct comparision function (struct studentData by name) */
    int struct_cmp_by_name (const void *a, const void *b)
    {
        struct studentData *ia = (struct studentData *)a;
        struct studentData *ib = (struct studentData *)b;
        return strcmp (ia->name, ib->name);
    }
    

    (注意 - 您没有发布足够准确的代码,但它会接近)在您的代码中调用为:

    qsort (record, number_structs, sizeof (struct studentData), struct_cmp_by_name);
    

    这将按成员name 对records 进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-10
      • 2019-08-04
      • 2015-11-06
      • 1970-01-01
      • 2020-11-23
      • 2017-11-27
      • 2013-11-25
      • 1970-01-01
      相关资源
      最近更新 更多