如何在c中声明链表

时间:2013-06-05 17:44:10

标签: c pointers linked-list malloc

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函数的参数传递它会做什么?

5 个答案:

答案 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;