排序结构记录

时间:2015-10-04 00:15:44

标签: c sorting struct

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

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

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

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:1)

除非您需要创建自己的排序例程,否则最好的方法可能是使用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);
}

(注意 - 您没有足够的qutie代码发布,但确实很接近)在您的代码中调用:

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

这将由成员recordsname进行排序。