#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的初始名称是否相同?
答案 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的
是node *一种数据类型,如int *或char *?
没有。你所拥有的将导致错误,除非你自己定义node
。
指针的类型&#34; next&#34;并且struct的初始名称必须相同?
这个想法。