【问题标题】:What would happen if a linked list was implemented without pointers?如果在没有指针的情况下实现链表会发生什么?
【发布时间】:2016-02-20 21:07:19
【问题描述】:

列表节点的标准结构是:

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

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

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

?

我认为主要问题是不知道列表在哪里结束,因为不会有 NULL 指针。但除此之外,还有什么其他影响需要考虑的吗?

【问题讨论】:

  • 不会是链表吧?
  • 要了解无限下降,首先要了解无限下降。
  • 你试过编译上面的声明吗?您认为以这种方式定义的结构的大小应该是多少?
  • @odin 你认为编译器会对sizeof(struct node) 做什么?
  • @odin19:指针类型的大小与它们所指向的类型的大小无关。

标签: c linked-list


【解决方案1】:

如果我们定义一个没有指针的节点会发生什么,像这样:

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

这声明了一个具有未终止递归的结构。因此声明无效并被编译器拒绝。

【讨论】:

    【解决方案2】:

    让我们计算一下:

    sizeof(struct node)
    

    好吧,我们有一个int,可能还有一些填充和sizeof(struct node)。把它放在一个公式中:

    sizeof(struct node) = sizeof(int) + padding + sizeof(struct node)
    

    这无法解决。

    从理论上考虑,它会是一个包含无限个自身的结构。

    没有值语义但使用引用语义的语言,如 Haskell,允许这种数据结构(类型)。我在这里过度简化了很多,但是将每个结构成员(记录字段)视为一个指针,那么它可能很清楚为什么或在那里工作:

    data List = EndOfList | Node Int List
    

    【讨论】:

      【解决方案3】:

      结构类型可能不包含自身的实例作为成员,原因有两个。

      首先,类型定义直到结构类型的关闭} 才完成;在类型定义完成之前,编译器不会知道为该成员分配多少空间。其次,包含自身实例的结构类型将无限大。

      一个结构类型可以包含一个指向自身的指针作为成员,因为允许指向不完整类型的指针,并且所有结构指针类型具有相同的大小和表示形式。

      你可以不使用指针创建链表;我做了 Fortran 77,它没有指针类型。您只需使用数组作为存储,并使用数组索引作为“指针”。

      【讨论】:

      • 如果类型定义不完整,那么为什么声明struct node* next; 不是错误的?
      • 因为允许指向不完整类型的指针;编译器不需要知道指向类型的大小来创建指向它的指针。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      相关资源
      最近更新 更多