我需要帮助解决一个我感到困惑的功能。我需要遍历struct数组以找出插入新元素所需的索引。 struct数组由firstname,lastname,grade level和grade组成。我需要按姓氏的字母顺序插入它们。如果有另一个相同的姓氏,我需要按名字的字母顺序插入它。我认为到目前为止我有正确的想法,但我真的很困惑如何将新元素插入到正确的索引中,然后移动我的struct数组中的所有其他元素。这是我到目前为止所用函数的代码,
void add(char* student_firstname, char* student_lastname, char* student_grade, char* student_level, struct student* list)
{
if(count > 30){
printf("No more room left in the array!");
}
else{
for(int i = 0; i < count; i++){
if(strcmp(list[i].lastName, student_lastname) == 0){
// There is another last name in the list
// Must sort alphabetically by first name
// Sorts by first name then returns 0 and adds one to count
}
} // end for loop to determine if same last name is in array
for(int i = 0; i < count; i++){
if(strcmp(student_lastname, list[i].lastName) < 0){
// Need to insert in index i - 1
int index = i - 1;
}
}
}
}
count变量是我的struct list的大小。有人可以通过代码向我显示如何按姓氏的字母顺序插入新元素吗?这将不胜感激。
编辑:此外,30是结构数组的最大大小。
编辑版本:
void add(char* student_firstname, char* student_lastname, char* student_grade, char* student_level, struct student* list)
{
if(count > 30){
printf("No more room left in the array!");
}
else{
int i = 0;
while( i < count && compare_student( list[i], new_student ) > 0 ){
i++;
// Move everything over 1 and insert
}
}
}
答案 0 :(得分:1)
我建议你add
函数做的第一件事是用提供的数据制作student
记录。创建一个函数来比较两个student
记录:
int compare_student( struct student *a, struct student *b )
{
int cmp = strcmp( a->lastName, b->lastName );
if( cmp == 0 ) cmp = strcmp( a->firstName, b->firstName );
return cmp;
}
现在,您可以更轻松地查看列表中的插入位置:
int i = 0;
while( i < count && compare_student( &list[i], &new_student ) > 0 ) i++;
完成后,您只需将i
和count
之间的所有内容放在右边的一个位置,然后删除新记录。将该练习留给您。
答案 1 :(得分:0)
从数组末尾开始并向后工作。对于您检查的每个元素,如果它在您添加的元素之后,将其复制到数组中的下一个更高位置。继续前进,直到您到达阵列的开头或遇到属于您要添加的元素之前的元素。然后添加新元素。