C typedef链表

时间:2017-03-11 11:40:47

标签: c struct linked-list typedef

假设我有一个带有指向相同类型变量的指针的结构,例如对于简单的链表实现。

这两种方法中哪一种最正确?

编辑:假设我之前已声明typedef struct list_ list;,否则选项2将无法编译

选项1:

typedef struct _list
{
    int num;
    struct _list *next;
} list;

选项2:

typedef struct _list
{
    int num;
    list* next;
} list;

编译和工作,我应该使用哪个?

3 个答案:

答案 0 :(得分:-1)

还有一个:

typedef struct _list list;

struct _list {
    int num;
    list* next;
};

修改
问题中提出的两个选项都是有效的,但我更喜欢第一个选项。选项号2有点可疑,因为在实际定义之前使用list标识符。但是,编译器可能会接受这样的声明,因为它足以让他们知道next成员是指向“某事物”的指针,并且他们不需要知道这一点是什么实际上'东西'是。在编译使用next成员的表达式时,这将是必要的,但list的含义(即,它是struct _list的别名)将是知道。

出于这个原因,这两个选项是等价的,选择是品味或习惯的问题。

我上面提到的第三个选项有点不同。它正确地将list声明为struct _list的同义词,但定义_list结构。这允许您发布使用类型的函数原型而不发布类型本身:

假设您实现了一个库来管理某个容器。 cont.h文件可能看起来像这样:

typedef struct _container Container;

Container *CreateContainer(void);
void DestroyContainer(Container *cont);
int AddDataToContainer(Container *cont, const char *data);
int PrintContainer(const Container *cont);

虽然实现细节隐藏在一个单独的cont.c模块中:

#include "cont.h"
#include "stdlib.h"

struct _container {
    //  all members declarations
};

Container *CreateContainer(void)
{
    // create an object
    Container *cont = malloc(sizeof(Container));
    if(cont != NULL) {
        // initialize its members
        ;
    }

    // and return it (or NULL on malloc() failure
    return cont;
}

void DestroyContainer(Container *cont)
{
    // cleanup the container contents
    ;
    // dispose the container itself
    free(cont);
}

// ....

答案 1 :(得分:-1)

没有真正的'正确的'回答这个问题;这是个人喜好的问题。与所有风格问题一样,我会说以下内容:

  • 保持一致
  • 如果您在团队中进行编码,请与团队的其他成员商定一种风格。

答案 2 :(得分:-1)

您可以使用其中任何一个。它们基本上是一回事。