C 将前10名分数写入文件

C 将前10名分数写入文件,c,linked-list,C,Linked List,我正在写一个21点程序,希望能够将最高分写入一个文件。显然,在程序运行的前几次,它将用每个分数填充高分列表,之后我只希望添加大于数字10的分数,并删除最初的数字10分数(现在是数字11)。我一直在考虑使用这样的链表: struct highScore { char name; int score; highScore *next; }; 我对链表的了解是非常基础的,所以我打算在编写代码之前先进行研究。 我想知道我是否把这件事复杂化了,是否有更简单的方法来完成这项工作,

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

struct highScore
{
    char name;
    int score;
    highScore *next;
}; 
我对链表的了解是非常基础的,所以我打算在编写代码之前先进行研究。
我想知道我是否把这件事复杂化了,是否有更简单的方法来完成这项工作,或者我在这方面走对了吗?

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

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

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

  • 如果以后要添加更多信息,则需要另一个阵列,更重要的是
  • 在一个阵列上执行的任何操作也需要在另一个阵列上执行,这可能会在以后引起问题(bug)

  • 总之,您的解决方案看起来不错。

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

    我认为使用数组将使您的程序具有相同的效率和更少的复杂代码

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

  • 在这两种情况下,查找元素与平均长度成正比

  • 在这两种结构中,在末尾插入元素是恒定的

  • 链表可以有效地在任何位置添加元素,但必须找到位置,所以这弥补了数组存在的问题,即必须将右侧元素向右移动一个位置

  • 我想大概是

      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上的指针。指针不能存储在文件中,因为它们是动态分配的,并且仅在程序生命周期内有效


    如果您对该解决方案感到失望,您可以检查和查看多个分数(如您的情况)的最终效率。

    仅了解您的要求:

    • 程序运行并获得分数

    • 您将分数文件读入一个列表,并将新分数与旧的最高分数进行核对

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

    • 程序退出

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


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

    不,这只适合我。我两个月前才开始编程,所以如果看起来是这样,请原谅我。我不是在寻找代码或任何东西,只是在正确的轨道上寻找一个指针如果你想开始在链表上练习,这是一个很好的初学者练习。注意:在c
    highScore
    中无效,您需要的
    struct highScore
    听起来好像您只需要有限的位置,在这种情况下,一个简单的10项数组就足够了。或者,如果您只想完成任务,请不要实现链接列表。在尝试实现自己的链表时,可能会引入很多bug。可以在C++标准库中使用链表。你仍然可以用C编写其余的代码。不,我不同意。如果你在C中编码,不要把C++库放进去。C是C++,C++是不混的。你可以使用一个HealScript记录数组代替两个不同的数组。- 1,如果你是一个高分列表,你必须遍历数组来找到插入的位置。LinkedList>Array是肯定的。两者都需要遍历,数组也需要移位,LinkedList则不需要。这在两种情况下都带来了相同的复杂性。若你们有指针数组,那个么插入数组元素的速度会更快,因为memmove()非常快,遍历数组也比遍历链表快。@SamDeHaan我现在已经实际测试过了。所以我用C++编写代码,我使用了两个数据结构。列表和向量。向量的运行速度似乎比列表快3倍左右。