我被困住了,因为我不明白这段代码在做什么:

struct node
{
    int info;          /* This is the value or the data
                          in the node, as I understand */
    struct node *next; /* This looks like a pointer. But
                          what is it doing in real life? */
} *last;               /* What is this and why is it
                          outside the body? What is this
                          thing doing? */


我知道创建一个节点时,它具有一个值,并且指向其他节点
但我不明白语法。

这是编写上面代码的更好方法吗?

有没有更简单的方法来编写相同的结构以更好地理解?

在我的演讲中,他们认为学生对他们的教学有了解。

最佳答案

好吧,我们可以向您解释这一点,但我们无法为您理解。

您提供的代码段是变量last的定义,是指向新定义的结构类型node的指针。可以将其写为:

typedef struct _node_t {
    int info;
    node_t *next;
} node_t;

node_t *last;


这样,我们就定义了typedef,也就是将类型定义的别名命名为某些短名称-在这种情况下,它将两个字段的结构别名为node_t。无论将什么定义为node_t类型,都告诉编译器您的意思是“这应该是前面提到的两个字段的结构”,而node_t *last则表示“变量last应该是指向node_t类型的指针”。

因此,回到语法:

struct foo {
    int a;
    float b;
    void *c;
} bar, *baz;


表示“定义结构类型foo,并使其包含三个字段-整数a,浮点数b和无类型指针c,然后使变量bar属于该结构类型,并使其可变baz指向此结构类型”。

现在指向指针。您所看到的称为“递归定义”,例如类型在自己的定义中提及自己。如果语言支持它们,它们是可以的(C可以),但是可以通过指定下一个节点指针为非类型来避免在链表节点结构中进行递归定义:

struct node_t {
    int info;
    void *next;
};


这样,您不再从node_t类型引用node_t类型,但是在使用这种类型时会增加一些不便(您必须将next强制转换为node_t类型,例如((*node_t)(last->next))->info而不是)。

如果您觉得需要其他参考,请考虑阅读交互式在线教程,例如http://www.learn-c.org/(我不隶属于)。

关于c - 链接列表令人困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22743640/

10-11 23:12
查看更多