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