#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 回答
使用
struct node* next
作为您的(未命名)结构的成员,您实际上做了两件事 - 向前声明结构struct node
并将名为next
的成员定义为指向(向前声明的)struct node
的指针 . 请注意,struct node
,因为它只是向前声明,是不完整的,并且是一个额外的新结构,它与您实际想要引用的封闭结构不同 . 同意struct forward declaration at cppreference:所以看起来好像你有一个指向你正在定义的相同
struct
的指针,但实际上你是(向前声明)并使用一个新结构 . 请参阅以下示例,该示例实际编译 .它没有,你应该得到编译错误,像gcc 6.3或4.2.1这样:
Deduplicator的现场演示 .
不会 . 除非你自己定义
node
,否则你所拥有的将导致错误 .这就是主意 .