c中的链表实现

时间:2014-10-31 19:35:59

标签: c linked-list

我是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引用实际的struct节点。

当我删除以下行中的*符号时,错误消失。它变成了:

    (emptyList)->head = 0;
    (emptyList)->next = NULL;

我也很困惑:

之间的区别是什么
LinkList* emptyList = malloc(sizeof(LinkList*));

LinkList* emptyList = malloc(sizeof(LinkList));

他们都编译得很好。

非常感谢。

1 个答案:

答案 0 :(得分:-2)

sizeof(Something *)通常为您提供4个字节(作为地址),这是地址的大小。

sizeOf(Something)为您提供对象的大小 - 在您的情况下,head(sizeof(int))可能是4个字节,指针可能是4个字节(sizeof(地址)) - 假设您的环境很多这里)。

请注意,正如Jonathan Lefler所指出的,地址大小取决于操作系统架构。它可以通过(位数/ 8(字节大小))来计算。因此,在32位上,地址长4个字节,在64位上,它们可能长8个字节。

当你说(* SomeObject)意思是指向时,你正在引用对象本身,所以你可以使用(* SomeObject).property
   当你有对象的指针。您可以使用箭头SomeObject-&gt;属性。这将获得SomeObject的引用并找到&#34;属性&#34;在它上面。