1
struct node {
int data;
struct node *next,*prev;
};
void insert(struct node *head,int data){
if(head == NULL){
head = (node *)malloc(sizeof(node));
 --- code continues-----

我只想知道和之间的区别 head = (node *)malloc(sizeof(node));如果struct node *head = malloc(sizeof(struct node));**head作为insert函数的参数传递它会做什么?

4

5 回答 5

3

和...之间的不同:

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

是 C 编译器将拒绝第一个并允许第二个,但 C++ 编译器将接受第一个并拒绝第二个。

node在 C 中,显示的代码在定义或声明时不会创建类型名称struct node。您需要添加typedef struct node node;C 源代码。C++ 自动node根据struct node. (C++ 编译器拒绝第二个,因为隐式转换 from void *to struct node *;C++ 不允许这样做,并且需要struct node *head = (struct node *)malloc(sizeof(struct node));

如果我**head作为insert函数的参数传递,它会做什么?

您必须调整函数的主体,但它允许您更改调用函数中列表头部的位置。

于 2013-06-05T17:48:11.353 回答
2

你的第一个问题的答案是:

head=(node *)malloc(sizeof(node));

malloc()返回一个类型的指针,void因此在这里您将其显式转换为类型的指针node。但是请记住,在 C 中,void()类型的指针隐式转换为分配给它的指针的类型。所以如果你这样写:

head=malloc(sizeof(node));

它仍然可以正常工作。但是对于 C++ 编译器,情况并非如此,在 C++ 中,指针类型void不会隐式转换为它分配给的指针类型。

也回答你的问题,

void insert(struct node *head,int data)

如果您**head作为参数传递,它将显示一个错误,声明运算符类型不匹配。这是因为您已将其声明为struct node *headnot as struct node **head

于 2014-01-31T16:12:26.603 回答
1

如果你输入

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

编译器将接受您的head = (node *)malloc(sizeof(node));代码。请记住,这typedef允许您以与在 C++ 中使用相同的方式使用结构。

于 2013-06-05T19:09:48.750 回答
0
create (struct node **p)
{
struct node *temp,*q;
int n;
printf("enter the length of link list");
scanf("%d".&n);
while(n>0)
{
if(*p == NULL)
{
*p=(struct node*)malloc(sizeof(struct node*));
printf("enter the element");
scanf("%d".&((*p)->data));
(*p)->next=NULL;
}
else
q=*p;
while(q->next=NULL)
q=q->next;
于 2013-06-05T19:37:56.070 回答
0

sizeof(node)从技术上讲,和sizeof(struct node)(至少在 C++ 中)之间没有区别,因为两者都会返回结构的大小。

然而,在 C 中它是强制写入的struct node,就像struct node在声明该类型的变量时强制写入一样,仅仅是因为没有 type node。C 只理解原语 ( int, char, long) 和用 声明的自定义类型struct。每个 C 编译器都对这个关键字非常严格,struct如果你忘记了它,就会假设你在谈论一个变量。

关于你的第二个问题:你不能。您不能将指针传递给指向函数的指针,该函数只接受常规指针,除非您对其进行强制转换。但是,在这种情况下,它将指向堆栈上完全任意的位置(指针所在的位置),并可能使您的程序崩溃。

于 2013-06-05T17:48:40.833 回答