C语言链表尾插函数中struct node**p的作用及能否替换为一级指针
为什么该函数要使用struct node **p作为入参
C语言所有参数传递默认是传值拷贝,函数内部修改的只是参数的副本,不会影响函数外的原变量。如果需要在函数内修改函数外定义的变量,必须传入该变量的指针:
- 要修改
int类型的外部变量,需要传入int*类型参数 - 你要修改的是
struct node*类型的外部头指针变量,自然需要传入struct node**(头指针的指针)作为参数。
这个设计最核心的价值是兼容空链表插入第一个节点的场景:当链表为空时,外部头指针是NULL,你需要直接修改这个头指针让它指向新创建的节点,只有通过二级指针解引用*p = 新节点才能修改到外部的原头指针。
另外你当前的代码还缺少空链表的边界处理逻辑,会在传入空链表时触发空指针访问崩溃,补充逻辑如下:
int end(struct node** p, int data){ struct node* new = (struct node*)malloc(sizeof(struct node)); new->data = data; new->next = NULL; // 补充空链表处理逻辑 if (*p == NULL) { *p = new; return 0; } struct node* last = *p; while(last->next !=NULL){ last = last->next; } last->next = new; return 0; }
能否直接用struct node *p代替struct node **p
分场景判断:
- 如果你能保证调用该函数时,链表永远不为空(头指针永远指向有效节点),可以用一级指针代替。因为这种场景下你不需要修改头指针本身,只需要修改已有节点的
next成员,访问成员不需要修改原头指针,一级指针足够完成操作。 - 如果你需要兼容空链表插入的场景,绝对不能用一级指针代替。如果传入一级指针,函数拿到的只是头指针的拷贝,就算你在函数内把拷贝指向新节点,外部的原头指针还是
NULL,插入第一个节点的操作完全无效。
内容的提问来源于stack exchange,提问作者abhinav srivastava
相关产品推荐
相关产品推荐

