难以理解链表实现(结构部分)?

时间:2017-05-24 08:36:19

标签: c++ struct linked-list

longitude,latitude,altitude

我不明白struct node { int data; struct node *next; }*start; 的作用,我知道它指的是下一个变量的地址;但是如何实施? struct node *nextnode *next相似吗?

struct node *next*start类似的是什么?

我发现很难理解链接列表的实现。

4 个答案:

答案 0 :(得分:3)

  

我不明白struct node *next的作用,我知道它指的是下一个变量的地址; ...

这是正确的。

  

......但是如何实施?

实现几乎就是您描述行为的方式:指针实现为一个对象,其值是指向对象的内存地址。

  

node *next是否与struct node *next相似?

不仅相似,而且非常相同。

  

*startstruct node *start类似的是什么?

struct node *start。请参阅完整声明:

struct node /* structure definition */ *start;

它是变量的组合声明,以及结构的定义。

struct关键字仅用于消除以下标识符在结构标记的名称空间††中的歧义。在您的情况下,它是多余的,因为没有非结构标识符Node来消除歧义,而在C ++中,结构标记也是类型名称。

您可能正在查看的是C代码,其中名称空间††说明符对于结构标记是必需的。

††在这个上下文中,我指的是C名称空格,而不是C ++名称空间。

答案 1 :(得分:2)

  

*startstruct node *start类似的是什么?

如果定义一个结构并在其后面添加一个名称,则声明该结构的变量。 在这里,您声明start变量,其类型为node*(指向节点的指针)。因此,名为start的变量是您的第一个节点。

  

我不明白struct node *next的作用,我知道它指的是下一个变量的地址;但是如何实施?

您的列表包含您之前所说的data as intaddress of the next节点。

在该列表的实现中,您将为每个新节点分配内存,并将该节点的地址放入结构的next成员中。为了更好地理解链接列表,我会看here

因此我建议编写插入,删除等功能

如果使用列表,则面向对象可能会有所帮助。但是要花时间去理解越来越复杂的代码。

答案 2 :(得分:1)

节点需要指向下一个节点。所以它有一个名为next的指针变量。由于next也是一个节点结构,因此将其声明为struct node *next;start是您的第一个节点。

答案 3 :(得分:1)

您的代码看起来真的像C片段,而不是C ++代码。在C ++中,您可能永远不会编写自己的列表实现,而是使用std::liststd::forward_list。如果你这样做,它看起来像

class list
{
  struct node
  {
    type data;          // type could be a template parameter
    node*next=nullptr;  // set next to null by default
  };
  node*head=nullptr;    // list is empty by default
public:
  /* ... */
};

特别是,struct中的struct node*next;关键字不是必需的,为了清楚起见,start指针可以在单独的行中声明。