'list'之前的预期表达式[C] [关闭]

问题描述 投票:-1回答:2

这是我原始程序的简短版本,但错误输出是相同的。我有3个档案:

list.h list.cmain.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;

我做错了什么?

c terminal linked-list
2个回答
1
投票

代码中几乎没有问题,首先在评论中已经提到过,你应该将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 */
}

1
投票

当您通过取消引用它们来传递指针时,您必须确保已单独声明它并指向某个内存(否则您将收到警告)。在你的情况下它没有发生,你已经声明了一个指针并同时传递它。这是一个传递解除引用指针的示例:

 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);
© www.soinside.com 2019 - 2024. All rights reserved.