关于链表中传二级指针的深入探讨

作者探讨了在实现单链表时,为何尾插尾删操作需要使用二级指针而非一级指针,特别提到空链表处理的问题。通过代码实例和调试,揭示了未初始化的一级指针可能导致的错误以及如何正确使用结构体指针和NULL值。

对于上一篇的实现单链表的博客,我总感觉还有那么一点点的小问题还没有想明白。

这个问题仍然是为什么在实现尾插尾删的地方要传二级指针而不是一级指针?

我听到过最多的原因就是为了处理当链表为空的时候,对空链表进行插入数据。

这种话听了也就听了,是真是假还是得动手实验。

首先来写一段代码来模拟传一级指针看看能不能实现尾插。

由于要传一级指针,因此在主函数中的SL sl只能是定义成一个结构体,并不能定义成一个结构体指针,然后在往PushBack里传一个地址,然后在实现PushBack的那边使用一级指针来接收。

此时发现,代码已经是崩溃了的

这是为什么呢?

进入调试看看

可以看到,此时的sl由于没有进行初始化,里面可以说是一片混乱,是一个野指针,空间是混乱的。

因此在执行到这行代码的时候,由于传过来的地址并不是NULL,这句就不成立,进不去if语句,所以就没法处理链表为空的情况。没办法给空链表进行插入数据。

而要想初始化sl,那就直接给sl赋一个NULL指针过去,就像这样

可以看到,这边赋值过去是报错的。这是因为sl此时仍然是一个结构体,而NULL是一个指针,这样是不可以直接赋值的。所以只能是把空指针赋值给结构体指针

这样就可以看到,是不会出现报错了。此时此刻,&sl代表的就不是结构体的地址了,而是代表指向结构体指针的地址,因此在PushBack那里,如果想改变*sl,就要使用**二级指针来接收*sl。

当这里变成二级指针的时候,相对应的,相关代码也应该跟着做些微调

首先来解释一下。

这个时候传过来的就是一个指针了,if里面判断的是当指针指向空的时候,就进入if语句。如果if指向空,那么就将*phead指针指向新开的节点node,在下面的输出中,由于->的优先级比*大,因此要先把前面的括起来,进行解引用后取结构体里面的值

### 使用二级指针进行链表初始化 在C语言中,使用二级指针初始化链表是一种常见的方法,尤其是在需要修改头节点时。以下是一个详细的说明和示例代码。 #### 为什么使用二级指针? 当初始化链表或对链表进行插入、删除等操作时,如果需要修改头节点(例如将新节点设置为头节点),则必须通过二级指针来实现[^3]。这是因为一级指针仅能改变其所指向的内容,而无法改变其自身的值。通过二级指针,可以直接修改原始指针的值,从而实现对头节点的动态调整。 #### 初始化链表的函数 以下是一个使用二级指针初始化链表的函数示例: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; // 使用二级指针初始化链表 int InitList(Node** L) { *L = (Node*)malloc(sizeof(Node)); // 分配头节点内存 if (*L == NULL) { // 检查内存分配是否成功 return -1; // 分配失败返回错误码 } (*L)->data = 0; // 初始化数据域为0,表示当前链表为空 (*L)->next = NULL; // 初始化指针域为空 return 0; // 成功返回0 } ``` #### 主函数调用示例 以下是如何在主函数中调用上述初始化函数的示例: ```c int main() { Node* L; // 定义一个指向头节点的指针 if (InitList(&L) != 0) { // 调用初始化函数,并检查返回值 printf("Error: Memory allocation failed\n"); return -1; } printf("List initialized successfully.\n"); return 0; } ``` 在上述代码中,`InitList` 函数接受一个指向指针的指针(即二级指针)作为参数。通过这种方式,可以在函数内部直接修改主函数中定义的 `L` 的值,从而成功初始化链表[^1]。 #### 代码解释 - `Node** L`:这是一个指向指针的指针,允许函数修改主函数中的指针变量。 - `*L = (Node*)malloc(sizeof(Node))`:为头节点分配内存。 - `(*L)->data = 0` 和 `(*L)->next = NULL`:分别初始化头节点的数据域和指针域。 - 返回值检查:如果内存分配失败,函数返回 `-1`,否则返回 `0` 表示成功。 #### 注意事项 - 在初始化链表时,必须确保内存分配成功。如果 `malloc` 返回 `NULL`,则表示内存分配失败,程序应进行相应的错误处理。 - 使用二级指针可以避免在函数内部直接操作主函数中的变量,从而使代码更加清晰和安全[^3]。 ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值