我是一名新生计算机工程专业的学生。当我准备一个程序来存储学生'在C程序中,出现了一些问题。
屏幕:http://imgim.com/5025incii2829330.jpg
我已经添加了两名学生并删除了第一个学生的信息。但是,第一个学生的信息仍然显示为空。
答案 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
结构列表创建为数组,而不是具有可变大小的列表。当您遍历它时,您正在打印学生,即使他们的信息已被清除。
为了实现你想要的输出,我会做两件事之一:
struct liste listeler[30];
。这是我将采取的方法。See here for some information on linked lists。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)
您已删除了有关学生的信息,但您尚未删除该记录。您需要删除记录并调整列表(侦听器),以便包含的条目中没有空条目。