结构列表,成员删除

时间:2014-05-14 17:59:33

标签: c list structure

我是一名新生计算机工程专业的学生。当我准备一个程序来存储学生'在C程序中,出现了一些问题。

屏幕:http://imgim.com/5025incii2829330.jpg

我已经添加了两名学生并删除了第一个学生的信息。但是,第一个学生的信息仍然显示为空。

这里是代码:http://pastebin.com/R6rSXaft

5 个答案:

答案 0 :(得分:1)

orgListele函数中,您正在遍历一系列学生,以便打印出信息。您的for循环打印信息如下:

for (i = 0; i<sayi; i++)
{

        printf("\n\nStudent:%d\n", i + 1);
        printf("ID:%s\n ", listeler[i].id);
        printf("National ID:%s\n", listeler[i].tckimlik);
        printf("Name:%s\n", listeler[i].isim);
        printf("Address:%s\n", listeler[i].adres);
        printf("Phone Number:%s\n", listeler[i].telefonnum);
}

看起来你并没有真正从数组中删除学生(不可能,反正),只是清除他们的信息。您已将liste结构列表创建为数组,而不是具有可变大小的列表。当您遍历它时,您正在打印学生,即使他们的信息已被清除。

为了实现你想要的输出,我会做两件事之一:

  1. 使用链接列表并删除所需的节点。当您遍历列表以打印所有内容时,您将不会使用已删除的节点,因为列表不再引用它们。数组实现不提供这个&#34;删除&#34;方面。它还允许此应用程序扩展到超过30名学生(这是由数组提出的限制,声明为struct liste listeler[30];。这是我将采取的方法。See here for some information on linked lists
  2. liste结构中添加另一个标志以保持删除状态。如果你添加一些作为布尔值的东西,比如int isValid,你将能够在下次循环时清除该变量(使其为0)。然后,您可以说if (listeler[i].isValid) {//print everything}并跳过那些被标记为无效的学生(isValid = 0

答案 1 :(得分:1)

变化

        for (i = 0; i<sayi; i++) //kayit sayisi degismediginden
    {

            printf("\n\nStudent:%d\n", i + 1);
            printf("ID:%s\n ", listeler[i].id);
            printf("National ID:%s\n", listeler[i].tckimlik);
            printf("Name:%s\n", listeler[i].isim);
            printf("Address:%s\n", listeler[i].adres);
            printf("Phone Number:%s\n", listeler[i].telefonnum);
    }

        for (i = 0; i<sayi; i++) //kayit sayisi degismediginden
    {

           if(listeler[i].id == 0) contnue; // skip the element if id is zero (zero idicates deleted item)
            printf("\n\nStudent:%d\n", i + 1);
            printf("ID:%s\n ", listeler[i].id);
            printf("National ID:%s\n", listeler[i].tckimlik);
            printf("Name:%s\n", listeler[i].isim);
            printf("Address:%s\n", listeler[i].adres);
            printf("Phone Number:%s\n", listeler[i].telefonnum);
    }

答案 2 :(得分:0)

你没有跟踪哪些结构是空的&#34;或者,您始终打印所有sayi全局变量所施加的限制。

简单的解决方案是跳过打印空id的字段,或其他字段。

答案 3 :(得分:0)

将变量的值设置为NULL并不会删除变量......它只是将其设为null。考虑查看动态内存分配,并在想要删除已被malloced的学生时使用free()方法。

答案 4 :(得分:0)

您已删除了有关学生的信息,但您尚未删除该记录。您需要删除记录并调整列表(侦听器),以便包含的条目中没有空条目。