1

我有以下代码。我收到错误消息'list' undeclared (first use in this function)。请帮我

#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;
}
4

7 回答 7

3

您使用的是 typelist而不是 variable name start。正确的代码:

while (start->next != NULL)
{
    start = start->next;
    // etc.
}
于 2012-04-26T12:05:48.907 回答
3

不要强制转换返回类型malloc- 它没有任何好处,在这种情况下你做错了!

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

应该

start = malloc(sizeof(struct list));

该类型list *不存在;你的意思是struct list *

您可以通过编写使其更加安全

start = malloc(sizeof(*start));

这样,您会自动malloc为 的(指针)类型提供足够的字节start,这在您以后更改的类型时很有用start-malloc调用不会改变一点。

于 2012-04-26T12:07:57.280 回答
1

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

包括不必要的类型转换。做就是了

start = malloc(sizeof(struct list));

但是,您的代码比这更麻烦。我可以通过问我自己的问题来最好地回答您的问题:在您的脑海中,是list类型还是对象?

如果您回答这个问题,就会怀疑您可以修复您的代码。祝你好运。

于 2012-04-26T12:09:18.933 回答
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;
}

您可以定义类型(列表 *)

于 2012-04-26T12:10:00.463 回答
1

您的变量被命名为« start »,您将其命名为« list »。

于 2012-04-26T12:23:01.050 回答
0
start = (struct list *) malloc ...

您在铸造中错过了struct 。正如 Anthales 指出的那样,这根本没有必要。

start = malloc ...
于 2012-04-26T12:08:23.130 回答
0

您遇到的一个问题是您在创建 typedef 后重新使用 struct 来声明您的 struct 指针,struct list *start;. 此外 struct 和 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

您可以选择在任何地方使用 struct list 并跳过使用 typedef 的制作。使用 typedef 可以简化代码的读取方式,如下所述:http ://en.wikipedia.org/wiki/Struct_%28C_programming_language%29#typedef

我已经重写了你刚才的内容,以便我可以编译它并更好地理解它,这样我就可以将一些数据放入一个节点中。我记得当我学习 C 时,整个 struct typedef 概念需要一点时间才能深入了解。所以,不要放弃。

#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;
}
于 2012-04-26T12:34:36.770 回答