我有一个包含学生姓名字段的结构。我想按字母顺序排列名称。以下是存储在结构名称字段中的名称列表:
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
请帮忙!我愿意使用任何内置函数。
答案 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);
这将由成员records
对name
进行排序。