1

私はこれを3日間試みました。私がしなければならないことは、サッカー選手のリンクされたリストを作成することです. 各サッカー選手は以下の情報を持っています。

プレーヤーの名前 (最大 15 文字) プレーヤーのジャージ番号 (整数) プレーヤーが獲得したポイント (整数)

サッカー選手に関する情報を格納するには、Player という構造体を定義する必要があります。上記のデータ メンバーとは別に、構造体には Player 型の別の構造体を指すことができる別のポインター メンバーが必要です。リンク リストを作成するには、次のアルゴリズムに従います。

  1. ヘッド ポインタと前のノード ポインタを宣言し、それらを NULL に設定します。

  2. Player 構造を動的に作成し、これが最初のノードである場合は、新しく作成された構造を指すヘッドと前のポインターを作成します。

  3. プレーヤー情報を入力して構造体に保存するようにユーザーに依頼します。ポインター メンバーを NULL に設定します。

  4. 最初のノードでない場合は、前のノードが指すノードのポインター メンバーを新しいノードに設定します。

  5. 続行するかどうかをユーザーに尋ねます。

  6. リンクされたリストの作成が完了していない場合は、ステップ 2 に進みます。

リンクされたリストを作成した後、私のプログラムは、各プレーヤーの番号、名前、および獲得したポイントをリストするテーブルを出力する必要があります。プログラムは、関数名 displayPlayer を使用してテーブルを出力する必要があります。メイン プログラムは、ヘッド ノード ポインターを関数に渡す必要があります。この関数は、プレーヤーの情報を適切な幅のフィールドに 1 行で表示する必要があります (setw を使用)。関数のプロトタイプは void displayPlayer(Player *) です。

私のプログラムは、プレーヤーの数または得点に負の値を受け入れるべきではありません。ユーザーが負の数を入力した場合、プログラムは適切なメッセージを表示し、ユーザーに再度入力を求める必要があります。

#include <iostream>
#include <cctype>
using namespace std;

struct Player
{
    char name[16];
    int jersey;
    int points;

    // declare the required members of the structure here

    Player *next;
};

void displayPlayer(Player *); // prototype of the display function 

int main()
{
    Player *headptr;
    Player *lastptr;
    Player *newnode;
    headptr = NULL;
    lastptr = NULL;

    //declare three pointers of Player type
    //one pointer to point to head node; one to point to previous node
    //and one to point to new node

    do {
        Player info;
        cout << " Enter name then jersey, points ";
        cin >> info.name;
        cin >> info.jersey;
        cin >> info.points;
        newnode->
        //dynamically create a new node of Player type and make the  new node           pointer  point to it 
        //enter data in to the new node (name, jersy no, score)
        //set the next field of new node to NULL
        if ()
        {   
            //make head node and previous node pointers equal to the new node   pointer
        } else {    
            //set the next member of of the previous node eqal to ne node pointer
            //make previous node pointer point to the new new node
        }
    } while(user wants to continue);
    // Call displayPlayer function with headnode pointer
}

void displayPlayer(Player *h) 
{
    while( not end of the list) {
        //display node content
    } // set h to next node
} 
4

2 に答える 2

3

では、ペンと紙のレイアウトをさせてください。ただし、実際のペンと紙ではなくコンピューター上で...

リストが空の場合、ヘッド ポインターとテール ポインターは両方とも NULL を指します。

頭 ---> NULL

テール ---> NULL

ノード A を空のリストに挿入します。

頭 --\ +------+
        }--> | あ |
テール --/ | 次へ | ---> ヌル
             +--------+

先頭と末尾の両方が唯一のノードを指しているのに対し、ノードの次のポインターは NULL (リストの最後のノードであることを意味します) を指しています。

リストの最後に新しいノード B を挿入すると、次のようになります。

          +--------+
頭 ---> | あ |
          | | 次へ | ------\ +--------+
          +-----+ }--> | ビ |
                     テール --/ | 次へ | ---> NULL
                                  +--------+

ヘッドはまだ A を指していますが、テールは A からの次のリンクと同様に B を指しています。B の次のリンクは NULL を指しており、これがリストの最後のノードであることを示しています。

ノード C をリストの先頭に追加すると、次のようになります。

          +--------+
頭 ---> | シー | +--------+
          | | 次へ | ---> | あ |
          +--------+ | 次へ | ------\ +--------+
                        +-----+ }--> | ビ |
                                   テール --/ | 次へ | ---> ヌル
                                                +--------+

ヘッドに追加するには、ヘッド ポインターを新しいノードを指すように変更し、C の次のポインターを古いヘッドを指すように変更するだけです。

リンクされたリストがどのように機能するかを理解するのに役立つことを願っています。

于 2012-12-07T06:32:58.973 に答える
2

これには数回の反復が必要です。

あなたが持っている Player 構造体は、最初はかなり良いです:

struct Player
{
  char name[16];
  int jersey;
  int points;

  Player *next;
};

これで基本がカバーされます。現在、この構造体にはデータ メンバーのみがあり、メソッドはありません。これは何もできないデータ コンテナです。他の操作が行われます。後で、メソッドを指定すると便利な場合があります。次は何?

編集:

でポインタを宣言しますmain。繰り返しますが、あなたはすでにそれを持っています:

int main()
{
  Player *headptr;
  Player *lastptr;
  Player *newnode;
  ...
}

これは、宣言するのに最も便利な場所ではないことが判明する場合がありますnewnode。ルーチンの先頭ですべての変数を宣言する慣行は、スタック メモリがリソースであり、慎重に扱う必要があった時代に由来します。今日では、読みやすいコードを持つことがより重要になっているため、必要になる前に変数を宣言するべきではありません。しかし、それについては後で心配することができます。次は何?

編集:

新しい を動的に作成するPlayer:

new Player;

これにより、新しいプレーヤーが作成されますが、すぐに失われます。風船を膨らませるときは、紐をつかむ必要があります。

newnode = new Player;

new演算子は、新しいオブジェクトへのポインター、つまりアドレスを返します。に保持したのでnewnode、次の操作を実行できます。

newnode->jersey = 34;
cout << newnode->jersey << endl;

それで?

編集:

Now things get dangerous. Character arrays are a pain in the neck, always have been. And getting input by `cin >> ...` is dangerous, and should be avoided in Real Life. But for now we can get away with:

newnode = new Player;
cout << "Enter name, then jersey number, then number of points:" << endl;
cin >> newnode->name >> newnode->jersey >> newnode->points;
cout << newnode->name << " " << newnode->jersey << " scored " << newnode->points << endl;

このコードはPlayer、メソッドとして構造体に入る可能性があることに注意してください。時間があれば後でやるかもしれません。次?

于 2012-12-07T06:11:44.893 に答える