我是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;
};
不工作。这段代码有什么问题,为什么我不能再向前声明节点指针
typedef struct node *ptr;
ptr start,current;
typedef struct node{
int value;
ptr next;
};
结构本身的类型定义不会以这种方式工作,我猜你在末尾缺少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;
};
在第二种情况下所做的不是前向声明。它试图在没有定义类型(node
)的情况下使用它。
第一种情况也不太适用。它给出以下警告:
警告:在空声明
中无用的存储类说明符
这是因为您没有为struct node
分配类型别名。你必须这样做:
typedef struct node{
int value;
ptr next;
} node;
现在,您可以使用node
来代替struct node
。