将前10个分数写入文件

时间:2012-03-22 19:41:05

标签: c linked-list

我正在写一个二十一点程序,并希望能够将最高分写入文件。显然,在程序运行的前几次,它将在每个分数中填充高分列表,之后我只想要添加大于10分的分数,以及最初的10分(现在为11分) )被删除。我一直在考虑使用这样的链接列表:

struct highScore
{
    char name;
    int score;
    highScore *next;
}; 

我对链表的了解非常基础,所以我打算在实际编码之前进行研究。 我想知道我是否过于复杂,以及是否有更简单的方法来完成工作,或者我是否在正确的轨道上?

4 个答案:

答案 0 :(得分:0)

我认为你的方法看起来不错。使用链接列表是有意义的,甚至是队列(可以使用链表实现)。

答案 1 :(得分:0)

链接列表肯定是一种很好的方法。它将与分数相关的数据保存在一起,并通过一些基本的簿记,您可以使其保持最新。当您对其进行排序时,您可以轻松地在正确的位置插入新的分数,并从链接列表中删除太低的分数。

另一种方法是维护两个数组,每个数组包含10个元素,一个用于名称,另一个用于分数,但这有几个缺点:

  1. 如果您稍后要添加更多信息,则需要另一个阵列,更重要的是,
  2. 您在一个阵列上执行的任何操作也需要在另一个阵列上完成,这可能会在以后造成麻烦(错误)。
  3. 因此,简而言之,您的解决方案看起来不错。

答案 2 :(得分:0)

我不认为链表是最好的方法。不要误解我,但是链表用于在随机位置添加和删除,最常见的是在开头或结尾。问题whit链表是它与普通数组相同的低效率,因为它必须检查每个元素,直到找到它为止。

我认为使用数组会使你的程序具有相同的效率和更简单的代码。

比较两种数据结构(链表和数组):

  1. 在两种情况下,查找元素的平均长度成正比。

  2. 在两个结构中,在末尾插入元素是不变的。

  3. 链接列表可以有效地在任何位置添加元素,但必须找到位置,因此这可以补偿数组所具有的问题,您必须将右侧元素向右移动一个位置。

  4. 我认为像

    这样的东西
      typedef struct
      {
          int score;
          char name[51]; //name should hold 50 chars and null
      } highScore;
    
      highScore scores[10]; // voilla 10 scores
    
    
      //or if you need little bit of complications 
      //and more speed when moving array during insertion
      highScore * scorespointer[10]; //array of 10 pointers on score
    

    将制作简单的解决方案,效率与链表相同。

    如果您将结构实现为链接列表,则无法直接在文件中对此进行序列化,因为您只能存储名称和分数,而不能存储下一个highScore的指针。指针不能存储在文件中,因为它们是动态分配的,仅在程序生命周期内有效。

    如果您对此解决方案感到失望,可以查看heaptree以获得超过极少数(例如您的情况)分数的最高效率。

答案 3 :(得分:0)

了解您的要求:

  • 程序运行并获得分数

  • 您将分数文件读入列表并根据旧的最高分检查新分数

  • 修改列表并将其写回文件

  • 程序退出。

如果这是正确的,那么链表似乎有点矫枉过正。阵列可以很好地完成工作。将文件中的每个条目读入数组,随时插入新分数。您可以完全放弃阵列,只需写出您读入的每个分数的文件,然后再次插入新分数。然后重命名文件(scores.txt变为scores.bak,scores.new变为scores.txt) - 这样你也可以获得分数文件的备份。请注意,您的文件最好以文本形式写入(即非二进制文件)。

如前所述,您的结构不会编译为纯C代码。如果你想用C语言而不是C ++编写,你应该让你的编译器拒绝C ++。你如何做到这一点取决于你的平台,但它可能只是命名文件scores.c而不是scores.cpp。