【问题标题】:How to use a linked list with a header file in C?如何在 C 中使用带有头文件的链表?
【发布时间】:2016-02-21 17:28:47
【问题描述】:

我必须创建一个使用链表执行各种功能的程序。我必须将函数保存在与 main() 不同的文件中,但是我不知道如何将列表包含在头文件中。 我尝试了不同的组合,现在我在linkedList.h 文件中有这个:

typedef struct list_elements* item;

这在linkedList.c中

typedef struct list_elements{
    int value;
    struct list_elements *next;
}item

问题是,当我尝试编译 main.c 时,我收到消息:“请求非结构或联合中的成员‘值’”和“请求非结构或联合中的成员‘下一个’联合”。

我查看了建议的教科书和在线但我找不到关于如何使用带有头文件的链表的解释?

(当我在一个文件中测试整个东西时,这些功能可以工作,所以我认为它们不是问题);

【问题讨论】:

  • 需要更多代码,这不足以找出问题所在。
  • 这没有意义。头文件在执行之前包含在已编译的程序中。你是说你在执行后重新编译程序?
  • 您确定typedef struct list_elements item 中的星号?你可能用过item head; head.value = ...

标签: c linked-list doubly-linked-list


【解决方案1】:

您尝试将相同的标识符键入两次作为不同的类型。

去掉第一个typedeftypedef struct list_elements* item;,把第二个放到头linkedList.h中,这个头必须包含在linkedList.c中。

【讨论】:

    【解决方案2】:

    您的标头中的声明将类型item 定义为指向struct list_elements 的指针。来自linkedList.c 的声明声明了相同的名称item,作为类型struct list_elements 本身的别名。虽然这本质上没有错,但肯定会令人困惑。 linkedList.c#include 的头文件确实会出错,通常它会这样做。

    您应该在头文件中进行所有类型声明,并将其包含在两个 C 源文件中,以确保它们共享这些声明。类型声明至少包括typedefs、structunion声明,以及函数原型。这不是您可能想要放在标题中的内容的排他列表。

    【讨论】:

      【解决方案3】:

      有不止一种方法可以做到这一点:

      其中之一是使用您要在 .h 文件中使用的函数原型定义结构,并在单独的 .c 中定义函数代码(当然,在 .h 文件中编写相同的原型),那么您现在可以通过包含您的头文件在任何其他 .c 文件中使用该结构。例如:

      StType.h

      typedef struct Something{
          int a;
          int b;
      }
      typedef struct anotherSomething{
          int c;
          int d;
      }
      
      int fct1();
      int fct2();
      

      Fct.c

      include StType.h;
      
      int fct1()
      {
          //...
      }
      void fct2()
      {
          //...
      }
      

      你的程序.c

      include StType.h
      
      int main()
      {
          Something s;
          fct1();
      }
      

      我通常会这样做。

      【讨论】:

        猜你喜欢
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 2011-10-23
        • 2021-09-16
        • 2019-11-06
        • 2017-01-04
        相关资源
        最近更新 更多