2017-09-23 77 views
0

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

让我们看看下面的程序 -

#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行,我们为什么还要提(struct node*) malloc函数之前?

那是什么意思?

我的第二个问题集:

如果我们做一个双向链表这将有一个节点结构,其中包括2个三分球(对下一个和前一个节点),将我们还初始化一个指针(用于遍历结构节点类型的列表)?

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

+6

谁告诉你,你需要的是什么?它甚至非常沮丧。一般来说,绝对不要使用不必要的演员,他们终有一天会落在你的头上。如果你从你的C书中得到了这些,可以找一个更好的。如果来自一些模糊的YouTube视频,博客或在线教程:获取一本好的C书。 – Olaf

+1

请注意,如果您使用C++编译器编译C代码,那么该投射将是必要的。在C语言中没有必要仅由C编译器编译。另请注意[我是否将'malloc()'的结果转换为?](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) –

+1

而不是'temp = malloc( sizeof * temp);'简单 - 不是吗? – chux

回答

-1

这是因为malloc的返回类型是void *。 (struct node *)是一个强制类型,使用它可以告诉编译器,您想将malloc返回的值作为指向struct节点的指针。

对于双链表就可以使用,

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

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

的意义就是让虫子在你的程序中,

malloc的返回void*,当你分配给你的struct somthing*将程序自动转换。

+0

该转换至少使程序与C++编译器兼容。 – synchronizer

+0

但问题是关于c代码,而不是关于需要与每种语言兼容的c代码 – Bizzu

+0

但问题是我们为什么要在malloc函数中指出类型的指针,因为我们已经声明它为类型' struct node *'? –

0

为什么我们需要在malloc函数前提及'(struct node *)', 那有什么意义呢?

通过malloc函数之前写(struct node*),你的类型转换返回值指定的类型。这里演员是可选的,并且often frowned upon

,如果我们正在一个双向链表这将有一个节点 结构,其中包括2个三分球(...

当进行双向链表,你应该声明是这样的:

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

您可以通过使用malloc功能的节点分配空间,nextprevious指针指针再次向struct node秒。召唤malloc再次为next元素分配空间。对于第一个节点,previous应该是NULL,对于最后一个节点,next应该是NULLHere是一个实现。

+0

正常情况下,'append'函数会在'next'中分配一个新节点,并让新节点指向当前(最后一个)节点的'prev'节点。没有存储将被分配给'prev'。 –

+0

@PaulOgilvie啊对了。也许我在写这些时没注意。编辑。 – babon

+0

但问题是我们为什么在我们已经将它声明为类型'struct node *'时指出malloc函数中的指针的类型? –

-1

malloc返回void指针(可以在头文件中检查和验证),因此类型转换是必要的,同时将其分配给其他类型的变量。

请求你在链路https://www.tutorialspoint.com/cprogramming/c_type_casting.htm

+0

对不起,你错了。你的参考是关于整数促销和数值类型的转换,而不是关于指针。 @ 0decimal0的回答是正确的。看到参考。 –

+0

我在说malloc的返回类型不是struct node *类型,因此它应该被structpec节点的指针类型typecasted –

+0

“'malloc' _will return_'void *'_当你赋值给你的struct类时*'_it会转换automaticlly._“(见其他答案。) –

1

读你只是因为它返回void*不投的malloc结果。还有就是一个很好的解释here

一个更好的解决方案可能是:

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

但问题是为什么我们意味着malloc函数中的指针的类型,当我们已经将其声明为类型'struct node *'? –

+0

答案还是一样,它的坏习惯。不需要投射malloc的结果。编写代码的人认为需要那些根本不合逻辑的演员。 – 0decimal0