2012-04-26 2 views
1

У меня есть код ниже. Я получаю ошибку как 'list' undeclared (first use in this function). Пожалуйста, помогите мне«list» uneclared (первое использование при этой функции)

#include <stdio.h> 
#include <stdlib.h> 
struct list{ 
int data; 
struct list *next; 
}; 
typedef struct list *head; 

int main() 
{ 
    struct list *start; 
    int i; 

    start = (list *) malloc(sizeof(struct list)); 
    printf("\nEnter the data : \n"); 
    scanf("%d", &i); 
    start->data = i; 
    start->next = NULL; 
    while(list->next != NULL) 
    { 
     printf("%d ", list->data); 
     list = list->next; 
    } 

    return 0; 
} 
+2

Вы не должны размещать скриншоты ... – ThiefMaster

+0

@ThiefMaster лучше чем размещение ничего (нет коды, нет журнала ошибок) .. – Krishnabhadra

+1

Комментариев: 1. не отлитого возвращаемого значения 'таНос () '; 2. не используйте 'sizeof struct' как свой аргумент, а' sizeof (* start) '; 3. Почему 'typedef struct list * head', когда вы его никогда не используете? –

ответ

3

Вы используете тип list вместо имени переменной start. Правильный код:

while (start->next != NULL) 
{ 
    start = start->next; 
    // etc. 
} 
+0

Спасибо большое ... Я сделал ошибку –

+0

Это только вторая ошибка исправлена. –

3

Don't cast the return type of malloc - нет никакой пользы от него, и в этом случае вы сделали это неправильно!

start = (list *) malloc(sizeof(struct list)); 

должно быть

start = malloc(sizeof(struct list)); 

типа list * не существует; вы имели в виду struct list *.

Вы можете сделать его еще более безопасным путем записи

start = malloc(sizeof(*start)); 

Таким образом, вы автоматически malloc достаточное количество байтов для (указателя) типа start, что полезно, когда вы позже изменить тип start - malloc вызов не изменяется немного.

0
start = (struct list *) malloc ... 

Вы пропустили -структуру в отливке. Это не обязательно, как указал Анталес.

start = malloc ... 
+2

Ради бога, не бросайте возвращаемый тип malloc! Остановите это безумие C++! – Anthales

1

The

start = (list *) malloc(sizeof(struct list)); 

включает в себя ненужное приведение типа. Just do

start = malloc(sizeof(struct list)); 

Однако у вашего кода больше проблем. Я могу ответить на ваш вопрос наилучшим образом, задав свой вопрос: на ваш взгляд, это тип или объект? list?

Если вы ответите на этот вопрос, вы подозреваете, что можете исправить свой код. Удачи.

1
#include <stdio.h> 
#include <stdlib.h> 
typedef struct list{ 
    int data; 
    struct list *next; 
} list; 

typedef struct list *head; 

int main() 
{ 
    struct list *start; 
    int i; 

    start = (list *) malloc(sizeof(struct list)); 
    printf("\nEnter the data : \n"); 
    scanf("%d", &i); 
    start->data = i; 
    start->next = NULL; 
    while(start->next != NULL) 
    { 
     start = start->next; 
    } 

    return 0; 
} 

вы можете определить тип (список *)

1

Ваша переменная с именем «старт» и вы назвали его «список».

0

Одна из проблем, с которыми вы столкнулись, заключалась в том, что вы повторно использовали struct в объявлении указателя структуры после создания typedef, struct list *start;. Кроме того, структура и typedef не могут иметь одно и то же имя. Вы получаете следующее:

cc -Wall test.c -o test 
test.c: In function ‘main’: 
test.c:13: error: ‘list_t’ undeclared (first use in this function) 
test.c:13: error: (Each undeclared identifier is reported only once 
test.c:13: error: for each function it appears in.) 
test.c:13: error: ‘start’ undeclared (first use in this function) 
test.c:13: error: ‘cur’ undeclared (first use in this function) 
test.c:13: warning: left-hand operand of comma expression has no effect 
test.c:16: error: expected expression before ‘)’ token 

Вы можете использовать список структур везде и пропустить создание с помощью typedef. Использование typedef упрощает, как ваш код читается, как указано здесь: http://en.wikipedia.org/wiki/Struct_%28C_programming_language%29#typedef

Я переписал то, что у вас есть, чтобы скомпилировать его и понять его немного лучше, и поэтому я мог бы поместить некоторые данные в один узел.Я помню, что вся концепция struct typedef занимает немного времени, чтобы погрузиться, когда я учился C. Итак, не сдавайтесь.

#include <stdio.h> 
#include <stdlib.h> 

struct list { 
    int data; 
    struct list *next; 
}; 

typedef struct list list_t; 

int main() 
{ 
    list_t *start, *cur; 
    int i; 

    start = (list_t *) malloc(sizeof(list_t)); 

    if (NULL != start) 
    { 
     cur = start; /* Preserve list head, and assign to cur for list trarversal. */ 
     printf("\nEnter the data : "); 
     scanf("%d", &i); 
     cur->data = i; 
     cur->next = NULL; 
     cur = start; 
     while(cur != NULL) 
     { 
      printf("%d ", cur->data); 
      cur = cur->next; 
     } 
    } 
    else 
    { 
     printf("Malloc failed. Program ending."); 
    } 

    return 0; 
} 
Смежные вопросы