1

我对 C 语言还是比较陌生,只有 2 个问题。我有一个学生结构:

   struct student{
        Name   name;
        Comment  comment;

        int ID;
        float fee;
    }

全球有 10000 名学生。名称和注释是只保存指向字符的指针的结构。还有5个功能:

      void InitStudent();
      BOOL AddNewStudent();
      BOOL DeleteStudent();
      BOOL ReportStudents():
      BOOL Cleanup();
  1. 在 InitStudents() 中,所有学生 ID 都必须初始化为 -1。不确定是否有比遍历整个数组并初始化 ID 更简单的方法?

  2. 在 ReportStudents 中,我们必须报告数据库中所有已添加的学生。问题是没有 StudentCount 变量或类似的东西。DeleteStudent 函数还可以删除在数组中留下空白的学生(无法更改)。函数也不能带任何参数。有没有办法循环或打印出所有学生而不必循环10000次检查ID是否不是-1?

提前致谢

4

4 回答 4

0
  1. 并非如此,如果您通过函数执行此操作,则需要遍历所有学生结构以将 ID 设置为 -1。虽然,如果您总是在使用该结构之前检查 ID,您可以避免使用memset因为-1有一个方便的位模式。

    /* assuming all_students is your array of struct student (and not a pointer
     * to a block of memory)
     */
    memset(all_students, -1, sizeof(all_students));
    
  2. 并非没有通过其他数据结构(例如链表或位图)来跟踪哪些学生有效的其他方法。

于 2013-09-17T13:21:38.030 回答
0

遍历数组是最简单的方法。

关于你的第二个问题,这一切都取决于整个实施。您可以对数组进行排序并保留下一个空数组位置以供插入。因此,在报告时,您可以循环到最后一个已知包含有效学生的索引(Id 不是 -1)

于 2013-09-17T13:31:18.790 回答
0

关于单个学生的检索,索引树可能会有所帮助。

填充数组后,可以构建带有数组索引和每个学生的可搜索值的树。

然后使用树执行搜索操作,将数组索引作为结果。

于 2013-09-17T14:06:32.037 回答
0

在 InitStudents() 中,所有学生 ID 都必须初始化为 -1。不确定是否有比遍历整个数组并初始化 ID 更简单的方法?

由于初始化表达式 (-1) 是一个常量表达式,您可以在技术上使用初始化列表语法初始化一个 10000 元素的数组,尽管我怀疑敲出一万个结构初始化器算作“更容易”。循环似乎是一个可行的解决方案。

在 ReportStudents 中,我们必须报告数据库中所有已添加的学生。问题是没有 StudentCount 变量或类似的东西。DeleteStudent 函数还可以删除在数组中留下空白的学生(无法更改)。函数也不能带任何参数。有没有办法循环或打印出所有学生而不必循环10000次检查ID是否不是-1?

不是真的,如果你有一个数组,那么你必须遍历整个数组。10000 个元素并不多,但是,就运行时间而言,这应该不是问题。

于 2013-09-17T13:28:05.863 回答