1

我已经尝试了三天。我要做的是创建一个足球运动员的链接列表。每个足球运动员都有以下信息。

球员姓名(最多 15 个字符) 球员球衣号码(整数) 球员得分(整数)

我必须定义一个名为 Player 的结构来存储有关足球运动员的信息。除了上述数​​据成员之外,该结构还应该有另一个指针成员,可以指向另一个 Player 类型的结构。要创建链表,请遵循以下算法:

  1. 声明头指针和前一个节点指针并将它们设置为 NULL。

  2. 动态创建一个 Player 结构,如果这是第一个节点,则使 head 和 previous 指针指向新创建的结构。

  3. 要求用户输入玩家信息并将其存储在结构中。将指针成员设置为 NULL。

  4. 如果不是第一个节点,则将前一个节点指向的节点的指针成员指向新节点。

  5. 询问用户是否要继续。

  6. 如果是,如果没有完成链表创建,则转到步骤 2。

创建链接列表后,我的程序应该打印一个表格,列出每个玩家的号码、姓名和得分。程序必须使用函数名 displayPlayer 来打印表格。主程序应该将头节点指针传递给函数。该函数应在适当宽度的字段中以单行显示玩家的信息(使用 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:

头 --\ +------+
        }--> | 一个 |
尾 --/ | 下一个 | ---> 空
             +------+

head 和 tail 都指向唯一的节点,而 nodes 的 next 指针指向 NULL(意味着它是列表中的最后一个节点)。

如果我们现在在列表末尾插入一个新节点 B,它将如下所示:

          +------+
头---> | 一个 |
          | 下一个 | ---------\ +------+
          +------+ }--> | 乙|
                     尾 --/ | 下一个 | ---> 空
                                  +------+

现在 head 仍然指向 A,但 tail 指向 B,以及来自 A 的下一个链接。B 中的下一个链接指向 NULL,表示这是列表中的最后一个节点。

如果我们将节点 C 添加到列表的头部,它现在将如下所示:

          +------+
头---> | C | +------+
          | 下一个 | ---> | 一个 |
          +--------+ | 下一个 | ---------\ +------+
                        +------+ }--> | 乙|
                                   尾 --/ | 下一个 | ---> 空
                                                +------+

添加到head只需要更改head指针指向新节点,将C的next指针指向旧head。

希望这可以帮助您了解链接列表的工作原理。

于 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 回答