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
函数的参数,它会做什么呢?
head = (node *)malloc(sizeof(node));
struct node *head = malloc(sizeof(struct node));
表示C编译器将拒绝第一种而允许第二种,但c++编译器将接受第一种而拒绝第二种。
在C中,当您定义或声明struct node
时,所示的代码不会创建类型名称node
。您需要在C源代码中添加typedef struct node node;
。c++根据struct node
的定义自动创建类型名称node
。(c++编译器拒绝第二种,因为从void *
到struct node *
的隐式强制转换;c++不允许这样,需要struct node *head = (struct node *)malloc(sizeof(struct node));
)
如果我传递
**head
作为insert
函数的参数,它会做什么?
您必须调整函数体,但它允许您更改调用函数中列表头的位置。
第一个问题的答案是:
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 *head
而不是struct node **head
。
如果你输入
typedef struct node{
int data;
struct node *next, *prev;
} node;
编译器将接受您的head = (node *)malloc(sizeof(node));
代码。请记住,typedef
允许您以与c++相同的方式使用该结构体。
从技术上讲,sizeof(node)
和sizeof(struct node)
之间没有区别(至少在c++中),因为两者都将返回结构体的大小。
struct node
,就像在声明该类型的变量时必须写struct node
一样,仅仅因为没有类型node
。C只理解原语(int, char, long
)和用struct
声明的自定义类型。每个C编译器对struct
这个关键字都非常严格,如果你忘记了它,就会假设你在谈论一个变量。
关于你的第二个问题:你不能。除非强制转换,否则不能将指针传递给函数的指针,因为函数只接受普通指针。然而,在这种情况下,它将指向堆栈上完全任意的位置(指针所在的位置),并可能导致程序崩溃。
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;