这是我原始程序的简短版本,但错误输出是相同的。我有3个档案:
list.h
list.c
和main.c
在main.c
文件中:
int main(int argc, char *argv[]){
list *head = NULL;
int b;
printf("Type int: \n");
while(b != 0){
scanf("%d", &b);
add(b);
}
print_list(list *head);
}
当我编译:
main.c: In function ‘main’:
main.c:21:13: error: expected expression before ‘list’
print_list(list *t);
^~~~
'list'类型已在list.h
中声明:
typedef struct lis{
int item;
struct lis *next;
}list;
我做错了什么?
代码中几乎没有问题,首先在评论中已经提到过,你应该将print()
称为
print_list(head);
代替
print_list(list *head);
其次,我假设add()
函数用于将新节点添加到列表中,字段item
被提供为b
。但我没有看到head
正在更新或从main()
函数传递到任何其他功能,使你的head
一直作为NULL
,如果是真的。我想你应该像下面这样打电话给add()
list *head = NULL; /* since its declared locally, you should pass to function like add() so that it can get updated */
while(b != 0){
scanf("%d", &b);
add(&head,b); /* calling add() function */
}
print(head);/* after head being updated through add() function, call the print() fun */
并定义add()
函数
void add(list **ptr,int num) {
/* logic for creating the list */
list *new = malloc(sizeof(list));/* everytime create new node */
new->item = num;/* fill the item field */
new->next = *ptr; /* update the new->next */
(*ptr) = new;/* update the head, this is important */
}
当您通过取消引用它们来传递指针时,您必须确保已单独声明它并指向某个内存(否则您将收到警告)。在你的情况下它没有发生,你已经声明了一个指针并同时传递它。这是一个传递解除引用指针的示例:
void fun(int i)
{ //BLANK FUNCTION
}
int main(void)
{
int i=9,*j;
i=&j;
fun(*i); //PASSING DEREFERENCED POINTER
return 0;
}
在你的情况下,最好创建一个指向链表的第一个节点的指针,然后在不解除引用的情况下传递它,即
print_list(head);