C中字符串/结构的排序数组
我是C语言的新手,我需要创建一个函数来对struct Student数据类型数组进行排序(按字母顺序排列在元素C中字符串/结构的排序数组,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,我是C语言的新手,我需要创建一个函数来对struct Student数据类型数组进行排序(按字母顺序排列在元素Student.ime之后)。我不确定应该把指针放在哪里,这样才能返回新数组 #include <stdio.h> #include <stdlib.h> #include <string.h> struct Student { int id; char ime[20]; char prezime[20]; char
Student.ime
之后)。我不确定应该把指针放在哪里,这样才能返回新数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
int id;
char ime[20];
char prezime[20];
char brindexa[20];
struct Datum datum_rodjenja;
};
struct Student sortiraj(struct Student niz[], int vel)
{
int i, j;
struct Student tempo;
tempo = niz[0];
for(j=0 ; j<vel ; j++)
{
for(i=j ; i<vel ; i++)
{
if(strcmp(tempo.ime,niz[i].ime)>0)
{
tempo = niz[i];
}
i++;
}
niz[j] = tempo;
j++;
}
return niz;
}
有人能给我一些提示吗。谢谢。首先,您的函数签名没有标记为返回类型作为
学生数组。其次,我不知道您尝试使用哪种排序算法,但您的实现不正确
如果您更正了函数签名,则在调用时不应出现任何错误:
struct Student* sortiraj(struct Student niz[], int vel)
有关sortiraj
的提示:检查排序算法的selection sort
或bubble sort
。为了进一步研究,您可以检查一些递归算法,如合并排序
和快速排序
,它们更先进,您需要更多的编程知识来实现它们
将函数sortiraj
的返回类型更改为void
在函数main
中创建并填充struct Student niz[]
数组
从函数main
,将数组及其长度(vel
)传递给函数sortiraj
当然,不需要从函数sortiraj
返回任何内容(如第1节所示)
由于您正在传入一个指针,即niz
,因此您正在更改niz
指向的内存。这意味着您不必返回niz
但是,如果要返回niz
,函数的返回类型必须与niz
相同。当前,您的返回类型为juststruct Student
,因此您应该会得到一个编译错误。您似乎正在对数组进行排序,因此根本不需要返回它。另外,使用标准库函数qsort()
:
另外,请使用英文函数和变量名。您是否考虑过使用qsort()
函数?例如:
如果有字符串数组say strings(注意:不是结构数组),字符串数为say,cnt,则:
函数sortstring定义为:
static int sortstring( const void *str1, const void *str2 )
{
const char *rec1 = *(const char**)str1;
const char *rec2 = *(const char**)str2;
int val = strcmp(rec1, rec2);
return val;
}
//for a simple test, run this main with the code above:
int main(void)
{
char *strings[]={"this", "is", "a", "test", "of", "the", "qsort", "function", "to", "try"};
int strlen = sizeof(strings)/sizeof(char *);
qsort(strings, strlen, sizeof(char *), sortstring);
return 0;
}
//Note my environment required #include <ansi_c.h>
static int-sortstring(const-void*str1,const-void*str2)
{
常量字符*rec1=*(常量字符**)str1;
常量字符*rec2=*(常量字符**)str2;
int val=strcmp(rec1,rec2);
返回val;
}
//对于简单测试,请使用上面的代码运行此main:
内部主(空)
{
char*strings[]={“this”、“is”、“a”、“test”、“of”、“the”、“qsort”、“function”、“to”、“try”};
int strlen=sizeof(strings)/sizeof(char*);
qsort(字符串、strlen、sizeof(char*)、sortstring);
返回0;
}
//注意我的环境要求#包括
一个能够缩进代码的新手-这是刷新,得到+1sortiraj
不正确。为什么不使用qsort
?您考虑过qsort吗?谢谢您的帮助。从现在起我将使用英语,我只是注册,所以我忘记了。我将尝试在我的代码中实现这一点。@H2CO3-您的答案更准确地回答了这个问题(结构数组排序)。不知道为什么我会打勾。像往常一样干得不错+1.
int cmp(const void *ap, const void *bp)
{
const struct Student *a = ap, *b = bp;
return strcmp(a->ime, b->ime);
}
struct Student students[] = { /* whatever */ };
qsort(
students,
sizeof(students) / sizeof(studends[0]),
sizeof(students[0]),
cmp
);
qsort(strings, cnt, sizeof(char*), sortstring);
static int sortstring( const void *str1, const void *str2 )
{
const char *rec1 = *(const char**)str1;
const char *rec2 = *(const char**)str2;
int val = strcmp(rec1, rec2);
return val;
}
//for a simple test, run this main with the code above:
int main(void)
{
char *strings[]={"this", "is", "a", "test", "of", "the", "qsort", "function", "to", "try"};
int strlen = sizeof(strings)/sizeof(char *);
qsort(strings, strlen, sizeof(char *), sortstring);
return 0;
}
//Note my environment required #include <ansi_c.h>