struct node {
int data;
struct node *next;
};
struct node * list,root;
list=NULL;
root=NULL;
上面是我在我的程序和我的程序中创建的,当我编译时给出了错误
kbc.c:8: warning: data definition has no type or storage class
kbc.c:8: error: conflicting types for ‘list’
kbc.c:7: note: previous declaration of ‘list’ was here
kbc.c:8: warning: initialization makes integer from pointer without a cast
kbc.c:9: warning: data definition has no type or storage class
kbc.c:9: error: conflicting types for ‘root’
kbc.c:7: note: previous declaration of ‘root’ was here
kbc.c:9: warning: initialization makes integer from pointer without a cast
如果有人希望看到我正在制作一个编写链接列表的程序,那么这是完整的程序
#include<stdio.h>
#include<stdlib.h>
struct node {
int data;
struct node *next;
};
struct node * list,root;
list=NULL;
root=NULL;
struct node * create_node(int );
int main ()
{
int i,j,choice;
printf("Enter a number this will be root of tree\n");
scanf("%d",&i);
printf("Give us choice 1 to enter more numbers 0 to quit\n");
scanf("%d",&choice);
switch (choice)
{
case 1:break;
case 2:break;
}
}
// end of function main
struct node * create_node(int data)
{
struct node *temp;
t emp = (struct node *)malloc(sizeof(struct node));
return temp;
}
答案 0 :(得分:3)
这在全球范围内不合适:
struct node * list,root;
list=NULL;
root=NULL;
试试这个:
struct node *list=NULL, *root=NULL;
原因是您无法在函数外部执行语句(如list=NULL
)。
答案 1 :(得分:3)
部分问题是你已经声明了一个指针和一个结构。您的声明等同于:
struct node *list;
struct node root;
这就是为什么指示指针的'*
'属于变量名(标准差中的声明符)而不是类型。
问题的另一部分是你只能使用(常量)初始化器初始化全局范围内的变量;你不能在全球范围内写作业。
有多种方法可以解决此问题:
typedef struct node *NodePtr;
NodePtr list = NULL, root = NULL;
struct node *list = NULL, *root = NULL;
struct node *list = NULL;
struct node *root = NULL;
请注意,不使用#define
代替typedef
的众多原因之一是:
#define NodePtr struct node * // BAD!
NodePtr list = NULL, root = NULL; // BAD!
确切地说明了问题中的错误情况。
解决一些错误消息:
kbc.c:8: warning: data definition has no type or storage class
这是指这一行:
list = NULL;
因为您在全局范围内编写,所以这被解释为变量定义,没有显式类型。这是现在的可怕风格,但在原始(标准前)C中允许使用'隐式 - int
'规则来推断类型 - 这也解释了一些后续消息。 '隐式 - int
'解释在C89中已经过时,并且没有得到C99的正式支持,但编译器仍然认识到它(至少在C99模式下会发出警告)。
所以,这被解释为:
int list = NULL;
现在解释这些消息:
kbc.c:8: error: conflicting types for ‘list’
kbc.c:7: note: previous declaration of ‘list’ was here
您编写的代码必须由编译器解释为list
的第二个声明。
kbc.c:8: warning: initialization makes integer from pointer without a cast
这是解释;由于第二个list
是int
而NULL
在此实现中是一个空指针常量(可能是#define NULL ((void *)0)
),因此从指针到整数的转换没有铸造。
第二组警告类似于root
。