【问题标题】:Creating a link in linked lists in C在 C 中的链表中创建链接
【发布时间】:2017-11-12 06:15:21
【问题描述】:

这是在列表中创建链接的代码,我从互联网上阅读该链接以尝试理解 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*)

因为我的理解是星号必须位于指针名称之前,但它位于结构名称的末尾。如果我错了,请纠正我,如果可以的话,请解释一下这是如何工作的?

【问题讨论】:

  • 你不需要演员表。
  • 正确struct node *link = malloc (sizeof *link); 然后if (link == NULL) { /* handle error */ }

标签: c struct linked-list malloc nodes


【解决方案1】:

没有必要强制转换malloc 的返回值。

按照标准7.22.3.4

malloc 函数返回空指针或指向 分配空间。

你应该检查它的返回值以知道它是否成功。

malloc 的作用是什么?

malloc 函数为大小由 size 指定且值不确定的对象分配空间。

我的理解是星号必须在指针名称之前,但它在结构名称的末尾

在这里,您没有取消引用任何内容。而是您在进行类型转换。 (这又是我重复的不必要的)。

struct node* 这里是指针变量的一种类型。同样intdouble 是一个类型,这也是一个类型。

【讨论】:

    【解决方案2】:

    假设您必须为拥有一些实体的学生创建数据库。

     struct node
        {
           int id;
           char name [100];
        };
    

    接下来,

    struct node *link = (struct node*) malloc(sizeof(struct node));
    

    上面的行是如何工作的?您需要创建一个节点或memory,那么您将如何创建它,使用malloc()。接下来你要创建的东西how much memory,等于你的data members结构的total size,所以它使用

     struct node *link = malloc(sizeof(struct node));
    

    这里的link 只不过是我们创建的用于将一些数据放入其中的动态内存的名称。创建内存后,将一些数据放入内存中。

       scanf("%d %s\n",&link->id,link->name);
    

    同样,您可以多次执行上述任务。

    类型转换不是强制性的,也不建议这样做。所以下面的说法是正确的。

    struct node *link = malloc(sizeof(struct node));

    【讨论】:

    • 假设您必须创建包含 3 个具有某些实体的学生的数据库。 好的,但是您在哪里使用这 3 个值?
    • @MFisherKDX 我只是举个例子,问的人可以使用结构数组然后分配相同的内存。
    【解决方案3】:

    为了创建一个链表,你必须分配单位——在你的情况下:

    结构节点

    因此,您要么为列表预先分配内存,要么在每次将节点添加到列表时动态分配它们,节点的内存必须从某个地方招募,在这种情况下 - malloc 就是这样做的。

    希望有帮助

    【讨论】:

      猜你喜欢
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2023-03-21
      • 2011-06-21
      相关资源
      最近更新 更多