链接列表节点内存分配

时间:2017-09-23 14:31:24

标签: c pointers data-structures malloc

在创建链表时,我们创建一个节点结构,它由数据和指向下一个节点的指针组成。稍后当我们创建一个将元素附加到链表上的函数时,我们创建一个临时节点来存储输入的数据。

让我们考虑以下程序 -

#include<stdio.h>
struct node
{
  int data;
  struct node* link;
}
struct node* root=NULL;
void main(append)
{
  struct node* temp;
  temp= (struct node*)malloc(sizeof(struct node))
  .....
}

我的第一个问题集:

在第11行中,为什么我们需要在malloc函数之前提到(struct node*)

那有什么意义?

我的第二个问题集:

如果我们要创建一个双向链表,其中包含2个指针(对于下一个节点和上一个节点)的节点结构,我们是否还要初始化结构节点类型的指针(用于遍历列表)?

在这种情况下,是否有不同的方法来初始化指针?

5 个答案:

答案 0 :(得分:1)

重要的是在你的程序中制造错误,

malloc将返回void*,当您分配给struct somthing*时,它会自动转换。

答案 1 :(得分:1)

您只是在返回malloc时不会投射void*的结果。有一个很好的解释here

更好的解决方案可能是:

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

答案 2 :(得分:0)

  

为什么我们需要提及&#39;(struct node *)&#39;在malloc函数之前,   这有什么意义?

通过在(struct node*)函数之前编写malloc,可以将返回值输入到指定类型。此处的演员阵容是可选的often frowned upon

  

如果我们正在创建一个具有节点的双向链表   由2个指针组成的结构(......

制作双向链表时,您应该声明如下内容:

struct node {
    int data;
    struct node *next;
    struct node *previous;
};

您可以使用malloc功能为节点分配空间。 nextprevious指针再次指向struct node s。再次调用mallocnext元素分配空间。对于第一个节点,previous应为NULL,对于最后一个节点,next应为NULLHere是一种实现方式。

答案 3 :(得分:-1)

这是因为malloc的返回类型是void *。 (struct node *)是一个转换,使用它来告诉编译器你要将malloc返回的值视为指向struct node的指针。

对于双链表,您可以使用

struct node
      {
       int data;
       struct node *next,*prev;
       };

int main()
{
   struct node *new_node=(struct node *)malloc(sizeof(node));
}

答案 4 :(得分:-1)

malloc返回void指针(可以在标题处检查和验证),因此在将其指定给其他类型的变量时需要进行类型转换。

请您阅读https://www.tutorialspoint.com/cprogramming/c_type_casting.htm

链接