如何在c语言中声明链表


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++中),因为两者都将返回结构体的大小。

然而,在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;

相关内容

  • 没有找到相关文章

最新更新