2012-03-22 6 views
1

私はブラックジャックプログラムを作成しており、トップスコアをファイルに書きたいと思っています。明らかに、プログラムが実行された最初の数回は、すべてのスコアをハイスコアリストに入力します。その後、追加される10スコアよりも高いスコアのみを追加します。最初の10スコア(現在は11 )を削除します。私はこのようなリンクリストを使用して考えてきた:トップ10スコアをファイルに書き込む

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

リンクリストの私の知識はかなり基本的なものですので、私は実際にそれをコーディングすることができます前に、私は私の研究を行う上でいきたいと考えています。 私はこれを過度に複雑化しているのだろうか、仕事をやり遂げるためのより簡単な方法があるのか​​、それとも私はここの正しい道にいるのだろうか?

+0

これは宿題ですか? – enobayram

+0

いいえ、それは私のためだけです。私は2ヶ月前にプログラミングを始めているので、そういう場合は私を許してください。私はコードや何かを探しているわけではなく、ちょうど正しい軌道にあるポインタ – karoma

+0

リンクリストで練習を始めたいのなら、これは初心者の練習に適しています。注意: 'highScore'は有効ではありません。' struct highScore'が必要です。 –

答えて

0

私はリンクされたリストが最善のアプローチだとは思わない。私は間違ってはいけませんが、リンクされたリストは、ランダムな位置で、最も一般的には開始時または終了時に追加および削除するために使用されます。問題のウィットリンクリストは、要素が見つかるまで各要素をチェックしなければならないので、通常の配列と同じ非効率性を持つ要素があることです。

私は、配列を使用すると、同じ効率とあまり複雑でないコードを持つプログラムになると思います。両方のデータ構造(リンクされたリストと配列)を比較

  1. 検索要素は、平均の長さに比例した両方の場合です。

  2. 最後に挿入する要素は、両方の構造で一定です。

  3. リンクされたリストは、任意の位置に要素を追加するのが効率的ですが、位置を見つける必要があるため、配列の右辺の位置を右に移動する必要があります。私は

    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をチェックして、あなたの場合のようにいくつかのスコアの究極の有効性を確認できます。ちょうどあなたの要件を理解する

+0

-1ハイスコアリストの場合は、挿入する位置を見つけるために配列を走査しなければなりません。 LinkedList>配列を確認してください。どちらもトラバースが必要で、配列にもシフトが必要ですが、LinkedListではシフトが必要です。 –

+0

これはどちらの場合も同じ複雑さをもたらします。ポインタの配列を持っているなら、memmove()は高速に狂っているので、要素を挿入する方が配列の方が速いでしょう。また、配列をたどることもリンクリストをたどるよりも高速です。 –

+0

@SamDeHaanこれを実際にテストしました。だから私はC + +でコードを書くと私は2つのデータ構造を使用している。リストとベクトル。ベクトルはリストよりも約3倍速いと思われます。 http://pastebin.com/2WFX58rA –

0

私はあなたのアプローチがよさそうだと思います。このためにリンクされたリストを使用することや、キュー(リンクされたリストを使用して実装することもできます)を使用することができます。

0

リンクされたリストは確かにこれを行う良い方法です。それはスコアに関連するデータをまとめて保持し、いくつかの基本的な簿記で最新の状態に保つことができます。並べ替えたままにすると、新しいスコアを適切な場所に簡単に挿入したり、リンクされたリストから低すぎるスコアを削除したりすることができます。

代替10個の要素それぞれ、名の1とスコアのための1を持つ2つの配列を維持することであるが、これはいくつかの欠点を有する:

  1. 後でより多くの情報を追加するつもりなら、あなたは」
  2. あなたが1つの配列で行う操作は、後でトラブル(バグ)を引き起こす可能性がある別の配列でも行う必要があります。

したがって、要するに、あなたのソリューションはよさそうです。

+2

2つの異なる配列の代わりにハイスコアレコードの配列を使用できます。 –

+0

それは良いことです:リンクされたリストより実装が簡単です! –

0

  • プログラムが実行され、スコアはあなたがスコアを読ん

  • を得ているが、リストにファイルや古いトップスコア

  • に対して新しいスコアをチェック
  • リストを変更してファイルに書き戻します。

  • プログラムが終了します。

これが正しい場合、リンクされたリストは過度のようです。配列は仕事をうまくやるでしょう。ファイルから配列に各エントリを読み込み、新しいスコアを挿入します。配列全体を先取りして、読み込んだ各スコアをファイルに書き出して、新しいスコアを挿入するだけです。その後、ファイルの名前を変更します(scores.txtはscores.bakになります、scores.newはscores.txtになります)。この方法でスコアファイルのバックアップも取得できます。あなたのファイルは、テキスト(つまり、バイナリではない)として書かれているのが最適です。

前述したように、あなたの構造は純粋なCコードとしてコンパイルされません。 C++ではなくC言語で記述したい場合は、コンパイラにC++を拒否させる必要があります。あなたのやり方はあなたのプラットフォームに依存しますが、scores.cppの代わりにscores.cというファイル名をつけるだけかもしれません。

関連する問題