我正在写一个二十一点程序,并希望能够将最高分写入文件。显然,在程序运行的前几次,它将在每个分数中填充高分列表,之后我只想要添加大于10分的分数,以及最初的10分(现在为11分) )被删除。我一直在考虑使用这样的链接列表:
struct highScore
{
char name;
int score;
highScore *next;
};
我对链表的了解非常基础,所以我打算在实际编码之前进行研究。 我想知道我是否过于复杂,以及是否有更简单的方法来完成工作,或者我是否在正确的轨道上?
答案 0 :(得分:0)
我认为你的方法看起来不错。使用链接列表是有意义的,甚至是队列(可以使用链表实现)。
答案 1 :(得分:0)
链接列表肯定是一种很好的方法。它将与分数相关的数据保存在一起,并通过一些基本的簿记,您可以使其保持最新。当您对其进行排序时,您可以轻松地在正确的位置插入新的分数,并从链接列表中删除太低的分数。
另一种方法是维护两个数组,每个数组包含10个元素,一个用于名称,另一个用于分数,但这有几个缺点:
因此,简而言之,您的解决方案看起来不错。
答案 2 :(得分:0)
我不认为链表是最好的方法。不要误解我,但是链表用于在随机位置添加和删除,最常见的是在开头或结尾。问题whit链表是它与普通数组相同的低效率,因为它必须检查每个元素,直到找到它为止。
我认为使用数组会使你的程序具有相同的效率和更简单的代码。
比较两种数据结构(链表和数组):
在两种情况下,查找元素的平均长度成正比。
在两个结构中,在末尾插入元素是不变的。
链接列表可以有效地在任何位置添加元素,但必须找到位置,因此这可以补偿数组所具有的问题,您必须将右侧元素向右移动一个位置。
我认为像
这样的东西 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的指针。指针不能存储在文件中,因为它们是动态分配的,仅在程序生命周期内有效。
答案 3 :(得分:0)
了解您的要求:
程序运行并获得分数
您将分数文件读入列表并根据旧的最高分检查新分数
修改列表并将其写回文件
程序退出。
如果这是正确的,那么链表似乎有点矫枉过正。阵列可以很好地完成工作。将文件中的每个条目读入数组,随时插入新分数。您可以完全放弃阵列,只需写出您读入的每个分数的文件,然后再次插入新分数。然后重命名文件(scores.txt变为scores.bak,scores.new变为scores.txt) - 这样你也可以获得分数文件的备份。请注意,您的文件最好以文本形式写入(即非二进制文件)。
如前所述,您的结构不会编译为纯C代码。如果你想用C语言而不是C ++编写,你应该让你的编译器拒绝C ++。你如何做到这一点取决于你的平台,但它可能只是命名文件scores.c而不是scores.cpp。