以下是在列表中创建链接的代码,我从互联网上读取以尝试了解c中的链接列表:
//insert link at first location
void insertFirst(int key, int data) {
//create a link
struct node *link = (struct node*) malloc(sizeof(struct node));
link->key = key;
link->data = data;
//point it to old first node
link->next = head;
//point first to new first node
head = link;
}
我真的不明白以下一行是如何运作的:
struct node *link = (struct node*) malloc(sizeof(struct node));
,更具体地说:
(struct node*)
因为我的理解是星号必须在指针名称之前,而在结构名称的末尾。如果我错了请纠正我,如果可以的话,请解释一下它是如何工作的?
答案 0 :(得分:2)
不需要转换malloc
的返回值。
根据标准 7.22.3.4
malloc函数返回空指针或指向的指针 分配空间。
您应该检查其返回值以了解它是否成功。
malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的。
我的理解是,星号必须位于指针名称之前,而它位于结构名称的末尾
这里你没有解除任何引用。相反,你是类型转换。 (我再说一遍,这是不必要的)。
struct node*
这里是一种指针变量。同样的方式int
或double
是一种类型,这也是一种类型。
答案 1 :(得分:1)
假设您必须为拥有某些实体的学生创建数据库。
struct node
{
int id;
char name [100];
};
接下来,
struct node *link = (struct node*) malloc(sizeof(struct node));
以上行如何运作?您需要创建一个节点或memory
,那么您将如何创建它,使用malloc()
。您要创建的下一件事how much memory
,等于total size
结构的data members
,因此使用
struct node *link = malloc(sizeof(struct node));
这里link
只不过是我们为了将一些数据放入其中而创建的动态内存的名称。一旦创建了内存,就将一些数据放入内存中。
scanf("%d %s\n",&link->id,link->name);
类似地,你可以不做任何次上面的任务。
类型转换不是强制性的,也不建议做。所以下面的陈述是正确的。struct node * link = malloc(sizeof(struct node));
答案 2 :(得分:1)
为了创建链接列表,您必须分配单位 - 在您的情况下:
struct node
因此,无论是为列表预先分配内存还是每次向列表添加节点时动态分配它们,都必须从某个地方招募节点的memoery,在这种情况下 - malloc会这样做。
希望有所帮助