error: request for member 'next' in something not a structure or union.What does that mean?

error: request for member 'next' in something not a structure or union.What does that mean?

我一直在使用链表进行训练,并且编写了以下代码:

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

typedef struct node *ptr;
struct node
{
    int element;
    ptr next;
};
typedef ptr list;
typedef ptr position;

int main()
{
    struct node nod1;
    struct node nod2;
    struct node nod3;

    nod1.element=87;
    nod2.element=87;
    nod3.element=98;

    nod1.next=&nod2;
    nod2.next=&nod3;
    nod3.next=NULL;

    list L;
    L.next=&nod1;

    printlist(L);

    return 0;
}

void printlist(list l)
{
    position p;
    p=(l)-> next;
    while(p!=NULL)
    {
        printf("%d",(p)-> element);
        p=p->next;
    }
}

我得到的错误是在这条语句中:

L.next=&nod1;

我不明白为什么,因为我已经在代码的开头定义了“list”,并且类型“ptr”也已经定义了:

typedef ptr list;

根据定义,你必须改变

L.next=&nod1;

L->next=&nod1;

因为在您的代码中,L 的类型为 struct node *

为避免混淆,请勿typedef指点。有时,它们变得非常棘手。

接下来,正如@WhozCraig先生在下面的评论中指出的,一旦你解决了这个问题,你分配L(或任何指针,就此而言),然后再使用它。否则,使用未初始化的指针调用 undefined behaviour.

你必须这样做

L->next = (struct node *) &nod1;

您定义了一个新类型 ptr,它是 struct node * 类型(指向 struct node 类型的指针)。之后,您将 list 定义为 ptr 类型。因此

list L;  

会将 L 声明为指向 struct node 指针。由于 L 是指向结构的指针,因此您需要一个 -> 运算符来访问它指向的元素。首先为L

分配内存
L = malloc(sizeof(struct node)); 

然后是

L->next=&nod1;