链表:指针的类型“next”和struct的名称是否相同?

时间:2017-06-08 13:24:07

标签: c pointers struct linked-list typedef

#include<stdio.h>
#include<stdlib.h>
typedef struct {
    int val;
    struct node* next;
} Node, *NodePtr;
void makeInitialLinkedList(int a[], int n)
{
    int i;
    NodePtr rec=NULL;
    NodePtr head=NULL;
    for (i=0; i<n; i++) {
        NodePtr cur=(NodePtr)malloc(sizeof(Node));
        if (i==0) head=cur;
        if (rec!=NULL) rec->next=(node*)cur;
        cur->val=a[i];
        cur->next=NULL;
        rec=cur;
    }

    // test
    while(n--) {
        printf("%d ", head->val);
        head=(NodePtr)head->next;
    }
}
NodePtr copy(NodePtr head)
{
    return NULL;
}
int main()
{
    //Mission #2
    int initialDataArray[10]={5,3,2,8,9,7,0,6,4,1};
    makeInitialLinkedList(initialDataArray, 10);

}

我不明白为什么会这样。我最初没有为结构命名,只是通过typedef创建了一个姓氏“Node”。那么“struct node * next”如何正常工作? node *是一种数据类型,如int *或char *?我想是这样的:

typedef struct strName {
    int val;
    struct strName* next;
} strSurName, *strPtr;

指针的类型“next”和struct的初始名称是否相同?

2 个答案:

答案 0 :(得分:2)

使用struct node* next作为您的(未命名)结构的成员,您实际上做了两件事 - 转发声明结构struct node并将名为next的成员定义为(向前宣布)struct node。请注意,struct node,因为它只是向前声明,是不完整的,是一个 additinal,new 结构,它与您实际想要引用的封闭结构不同。还要struct forward declaration at cppreference

  

以下形式struct name;的声明隐藏了任何内容   先前声明的标记名称空间中名称的含义   并将name声明为当前作用域中的新结构名称   稍后定义。在定义出现之前,此结构名称具有   不完全类型。这允许结构相互引用:

struct y;
struct x { struct y *p; /* ... */ };
struct y { struct x *q; /* ... */ };

所以它只是似乎就好像你有一个指向你定义的同一个struct的指针,但实际上你是(向前声明)并使用一个新结构。请参阅以下示例,该示例实际编译。

struct known_struct {
    int a[20];
};

struct own_struct {
    int val;
    struct known_struct* known;
    struct own_struct *own;
    struct unknown_struct* unknown;
} test;

int main(){

    size_t sizeOfKnownMember = sizeof(*(test.known));  // gives 80
    size_t sizeOfMemberOwn = sizeof(*(test.own));  // gives 32
    // size_t sizeOfunknownMember = sizeof(*(test.unknown));  // invalid application of sizeof to incomplete type `struct unknown_struct`

    return 0;
}

答案 1 :(得分:0)

  

我不明白为什么会这样。

它没有,你应该得到编译错误,比如gcc 6.3或4.2.1:

prog.c: In function ‘makeInitialLinkedList’:
prog.c:15:35: error: ‘node’ undeclared (first use in this function)
         if (rec!=NULL) rec->next=(node*)cur;
                                   ^~~~
prog.c:15:35: note: each undeclared identifier is reported only once for each function it appears in
prog.c:15:40: error: expected expression before ‘)’ token
         if (rec!=NULL) rec->next=(node*)cur;
                                        ^
Deduplicator的

Live demo

  

是node *一种数据类型,如int *或char *?

没有。你所拥有的将导致错误,除非你自己定义node

  

指针的类型&#34; next&#34;并且struct的初始名称必须相同?

这个想法。