C语言:仅以Shelf为入参打印嵌套书架-书籍链表的结构体内容
嵌套双层链表打印功能实现指南
现有打印代码的核心问题
- 书架遍历死循环:外层
while (shelf != NULL)的循环体内没有执行shelf = shelf->next的指针迭代,只要传入非空的书架头节点,程序会永久卡在同一个书架节点上反复打印,无法退出循环 - 空指针访问风险:未对当前书架的
books成员做空值判断,由于create_shelf初始化时会把books置为NULL,一旦遇到未挂载书籍的空书架,直接访问shelf->books->text会触发内存非法访问,程序直接崩溃 - 缺失书籍链表遍历逻辑:完全没有嵌套遍历当前书架下挂载的书籍链表,既没有拿到书籍链表的头节点做循环判断,也没有沿
book->next指针逐本跳转,所有非第一本的书籍内容都会被遗漏 - 输出格式不符合预期:打印语句没有添加换行、节点间分隔标识,所有输出内容会粘连在同一行,无法区分不同书籍的属性值
满足约束的正确实现
函数入参严格限定为仅接收Shelf类型,通过双层嵌套循环完成全节点遍历,代码如下:
void print_everything (Shelf shelf) { // 外层循环:遍历整条书架链表 while (shelf != NULL) { // 取出当前书架的书籍链表头指针,作为内层遍历的起点 struct book *cur_book = shelf->books; // 内层循环:遍历当前书架下的所有书籍 while (cur_book != NULL) { // 按要求格式打印单本书的属性 printf("%d, %d\n", cur_book->text, cur_book->image); // 指针跳转至下一本书 cur_book = cur_book->next; } // 指针跳转至下一个书架 shelf = shelf->next; } }
实现逻辑说明
- 采用双层嵌套遍历结构,外层逐节点遍历书架链表,内层逐节点遍历对应书架下的书籍链表,无遗漏覆盖所有节点
- 内层循环以
cur_book != NULL为终止条件,自动跳过空书架场景,不会触发空指针非法访问 - 所有指针跳转操作均在函数局部变量上完成,不会修改外部传入的原始链表结构,符合链表遍历的无侵入要求
内容的提问来源于stack exchange,提问作者pikamoch
相关产品推荐
相关产品推荐

