我是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/

10-11 21:57