2

我是 C 新手,老实说,我不知道从哪里开始从结构数组中删除特定元素。

如果你愿意,你可以在这里查看和复制我的全部代码:http: //pastebin.com/Zbrm2xyL

大多数情况下,我关心函数“rmv_student”,它应该在提示用户确认后从数组“st_array”中删除具有匹配 id 号的结构,而不会弄乱该数组的其他元素。函数'rmv_student'如下:

void rmv_student(long id) // BROKEN
{
int i; // iterator
char response; // used to confirm deletion

for( i = 0; i < MAX; i++){
    if ( st_array[i].id == id){
        printf("Are you sure you want to delete %s %s, %d?\n", st_array[i].first_name, st_array[i].last_name, st_array[i].id);
        puts("You will not be able to undo the deletion.");
        puts("Enter 'y' to delete or 'n' to return to the main menu.");
        response = getchar();

        switch (response){

            case 'y':
                // delete

            case 'Y':
                // delete

            case 'n':
                main();

            case 'N':
                main();

            default:
                puts("Please enter 'y' or 'n'.");
                rmv_student(id);
        }
    }
}
if ( i == MAX ){
    printf("\nThere are no students with ID %d.\n\n", id);
    main();
}
}

我有两个问题。

  1. 我的开关盒是否正确?这会正确测试用户的输入字符吗?

  2. 我该如何删除结构?

在你问之前。是的,这是家庭作业。因此,我不是在寻找讲义,只是在寻找正确方向的一点。欢迎任何其他建议。

注意:我知道我并不真正需要函数“menu_test_input”,但我现在要离开它。

4

3 回答 3

1

使用循环和返回语句而不是递归调用!请记住,当被调用函数返回时,代码将在调用后继续。

而是执行以下伪代码之类的操作

do
{
    print_prompt()
    get_response()

} while (response is not legal)

if (response is yes)
    do_the_actual_deletion

如果要删除数组 A 的元素 X,则将元素 X + 1 移动到 X,将元素 X + 2 移动到 X + 1,等等。完成后,将大小减一。不涉及实际的“删除”。

于 2013-11-04T07:03:58.573 回答
1

您的问题有两种可能的解决方案,您应该使用哪一种取决于数组元素的顺序是否对您很重要。

  1. 快速解决方案:将数组中的最后一个元素复制到要删除的元素的位置,然后简单地减少数组中元素的数量。

    int* array = ...;
    int elementCount = ...;
    ...
    int deletionIndex = ...;
    array[deletionIndex] = array[--elementCount];    //the deletion is actually a one liner :-)
    

    每当您使用未排序的数组时,此解决方案是首选解决方案,它只需要固定的时间,无论您在哪里进行删除。

  2. 长期解决方案:将已删除元素后面的所有元素移到前面一个位置。

    //setup is the same as for the fast solution
    elementCount--;
    for(int i = deletionIndex; i < elementCount; i++) array[i] = array[i+1];
    

    不完全困难,但比快速解决方案复杂得多。

    每当您需要保留数组元素的相对顺序时,都需要使用它。订购的代价是运行时间取决于需要移动的元素数量。

于 2013-11-04T19:51:31.817 回答
0

你必须使用break;

case 'y':
//your code 
     break;
case 'Y':
//your code 
     break;
case 'n':
     break;
...
......

否则代码将运行您的所有案例。

正确使用 - http://www.tutorialspoint.com/cprogramming/switch_statement_in_c.htm

于 2013-11-04T12:57:23.937 回答