如果没有指针实现链表,会发生什么?

时间:2016-02-20 21:07:20

标签: c linked-list

列表节点的标准结构是:

struct node {
  int x;
  struct node *next;
};

但是,如果我们定义一个没有指针的节点会发生什么,例如:

struct node {
      int x;
      struct node next;
};

我认为主要问题是不知道列表的结束位置,因为没有NULL指针。但除此之外还有其他任何影响需要考虑吗?

3 个答案:

答案 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,它没有指针类型。您只需使用数组作为存储,并使用数组索引作为"指针"。