我是c的新手,今天我尝试在c中实现链表。
我只有一个函数调用createEmptyList()
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
typedef struct Node
{
int head;
struct Node *next;
}LinkList;
LinkList* createEmptyLinkList(){
LinkList* emptyList = malloc(sizeof(LinkList*));
(*emptyList)->head = 0;
(*emptyList)->next = NULL;
return emptyList;
}
我试图使用指针初始化第一个节点。但是,在编译时,会出现以下错误:
linkedListImple.c:115:14: error: member reference type 'LinkList'
(aka 'struct Node') is not a pointer; maybe you meant to use '.'?
(*emptyList)->head = 0;
~~~~~~~~~~~~^~
.
linkedListImple.c:115:21: error: expression is not assignable
(*emptyList)->head = 0;
~~~~~~~~~~~~~~~~~~ ^
linkedListImple.c:116:14: error: member reference type 'LinkList'
(aka 'struct Node') is not a pointer; maybe you meant to use '.'?
(*emptyList)->next = NULL;
~~~~~~~~~~~~^~
.
linkedListImple.c:116:21: error: expression is not assignable
(*emptyList)->next = NULL;
~~~~~~~~~~~~~~~~~~ ^
我真的很困惑,尽管我认为我犯了一个非常基本的错误。
这里不是空列表指针吗?因为我声明它为LinkList*emptyList。因此,如果emptyList是指针,那么*emptyList引用实际的结构节点。
当我删除以下行的*登录时,错误消失。它变成:
(emptyList)->head = 0;
(emptyList)->next = NULL;
我也很困惑:两者之间有什么区别
LinkList* emptyList = malloc(sizeof(LinkList*));
和
LinkList* emptyList = malloc(sizeof(LinkList));
他们都编得很好。
非常感谢你。
最佳答案
size of(Something*)通常提供4个字节(作为地址),这是地址的大小。
size of(Something)给出了对象的大小——在您的例子中,头部的大小可能是4字节(sizeOf(int)),指针的大小可能是4字节(sizeOf(address)——假设这里有很多关于您的环境的信息。
注意,正如Jonathan Lefler所指出的,地址大小取决于操作系统架构。它可以通过(位数/8(字节大小))来计算。所以,在32位上,地址是4字节长,在64位上,地址可能是8字节长。
当您说(*SomeObject)这意味着指向时,您引用的是对象本身,因此您可以使用(*SomeObject).property
当你有了对象的指针。您可以使用箭头SomeObject->属性。它将得到某个对象的引用并在其上找到一个“属性”。
关于c - C中的链表实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26682179/