列表节点的标准结构是:
struct node {
int x;
struct node *next;
};
但是,如果我们定义一个没有指针的节点会发生什么,例如:
struct node {
int x;
struct node next;
};
我认为主要问题是不知道列表的结束位置,因为没有NULL
指针。但除此之外还有其他任何影响需要考虑吗?
答案 0 :(得分:2)
如果我们定义一个没有指针的节点会发生什么,如下所示:
struct node { int x; struct node next; };
这声明了一个带有无终止递归的结构。因此,声明无效,并被编译器拒绝。
答案 1 :(得分:1)
让我们计算一下:
sizeof(struct node)
好吧,我们有一个int
,可能还有一些填充和sizeof(struct node)
。把它放在一个公式中:
sizeof(struct node) = sizeof(int) + padding + sizeof(struct node)
这无法解决。
从理论上思考它,它将是一个包含无限数量的结构。
没有值语义但使用引用语义的语言(如Haskell)允许使用这种数据结构(类型)。我在这里过分简化,但想到每个结构成员(记录字段)作为指针,那么它可能很清楚为什么或在那里工作:
data List = EndOfList | Node Int List
答案 2 :(得分:0)
由于两个原因,结构类型可能不包含自身实例作为成员。
首先,类型定义在结构类型的结束}
之前是不完整的;在类型定义完成之前,编译器不知道为该成员分配了多少空间。其次,包含自身实例的结构类型将无限大。
结构类型可以包含指针作为成员,因为允许指向不完整类型的指针,并且所有结构指针类型具有相同的大小和表示。
您可以在不使用指针的情况下创建链接列表;我做了Fortran 77,它没有指针类型。您只需使用数组作为存储,并使用数组索引作为"指针"。