我是c编程和创建链表数据结构的新手,我的老师给了我一些看起来有点令人困惑的代码:
typedef struct node *ptr;
ptr start,current;
typedef struct node{
int value;
ptr next;
};
这段代码工作正常,使用我可以创建链表的其他功能,我的困惑是,当我改变这样的代码时:
node *start;
node *current;
typedef struct node{
int value;
node *next;
};
它不起作用。这段代码出了什么问题,为什么我不能再向前声明节点指针了。
答案 0 :(得分:4)
typedef struct node *ptr;
ptr start,current;
typedef struct node{
int value;
ptr next;
};
struct本身的typedef不会以这种方式工作,我猜你最后错过了node
(它缺少新定义类型的标识符)。
此时,我会告诉您的老师,请不通过typedef
指针类型让所有人感到困惑。在每次使用时都可以看到指针类型修饰符,这一点很常见,只是为了明确是指针。但现在回答实际问题:
node *start;
node *current;
typedef struct node{
int value;
node *next;
};
从第一行开始:您在此处使用node
作为类型标识符。但是你没有告诉编译器类型node
应该是什么类型。事实上,你实际上缺少的是前瞻声明。它的工作原理如下:
/* forward-declare "struct node" and at the same time define the type
* "node" to be a "struct node":
*/
typedef struct node node;
/* now use your type by declaring variables of that type: */
node *start;
node *current;
/* finally fully declare your "struct node": */
struct node {
int value;
node *next;
};
或者,如果没有typedef
,那很容易让初学者感到困惑:
struct node; /* forward declaration (not strictly necessary in this little example) */
struct node *start;
struct node *current;
struct node {
int value;
struct node *next;
};
答案 1 :(得分:1)
你在第二种情况下所做的不是前瞻性声明。它试图使用类型(node
)而不定义它。
第一种情况也不太奏效。它给出了以下警告:
警告:空声明中无用的存储类说明符
这是因为您没有为struct node
分配类型别名。你必须这样做:
typedef struct node{
int value;
ptr next;
} node;
现在,您可以使用node
代替struct node
。