按字母顺序将struct元素插入结构数组?

时间:2016-02-21 23:04:47

标签: c

我需要帮助解决一个我感到困惑的功能。我需要遍历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

    }

}

} 

2 个答案:

答案 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++;

完成后,您只需将icount之间的所有内容放在右边的一个位置,然后删除新记录。将该练习留给您。

答案 1 :(得分:0)

从数组末尾开始并向后工作。对于您检查的每个元素,如果它在您添加的元素之后,将其复制到数组中的下一个更高位置。继续前进,直到您到达阵列的开头或遇到属于您要添加的元素之前的元素。然后添加新元素。