C语言嵌套链表打印不完整,如何输出含嵌套结构的完整内容
问题根因
- 链表构造逻辑错误:现有代码对
node返回的链表指针进行强制类型转换后解引用,属于非法内存操作,完全不符合嵌套链表的构造规则。嵌套链表要求子链表的首地址作为父节点的data字段存储,而非强行拼接节点内存。 - 打印函数无类型判断逻辑:现有
print_ll直接将所有data强转为char*读取,无法识别data中存储的子链表指针,自然不能递归打印嵌套结构。
修改方案
给链表节点增加类型标记,区分data存储的是普通字符还是子链表指针,同时修正链表构造逻辑、重写支持递归的打印函数。
完整修正代码
#include <stdio.h> #include <stdlib.h> #define data(LINKED_LIST) ((LINKED_LIST)->data) #define rest(LINKED_LIST) ((LINKED_LIST)->rest) #define type(LINKED_LIST) ((LINKED_LIST)->type) // 节点类型标记:0存储char类型,1存储子链表指针 #define TYPE_CHAR 0 #define TYPE_LIST 1 typedef struct LINKED_LIST { int type; void *data; struct LINKED_LIST *rest; } *list; list node(int type, void *d, const list L); void print_ll(list L); int main() { list lst = NULL; char a = 'a', b = 'b', c = 'c', d = 'd', e = 'e'; // 构造子链表 (b c) list sub_lst = node(TYPE_CHAR, &b, node(TYPE_CHAR, &c, NULL)); // 构造主链表结构:a -> [子链表节点] -> d -> e -> 空 lst = node(TYPE_CHAR, &a, node(TYPE_LIST, sub_lst, node(TYPE_CHAR, &d, node(TYPE_CHAR, &e, NULL)))); print_ll(lst); printf("\n"); return 0; } list node(int type, void *d, const list L) { list Node = malloc(sizeof(struct LINKED_LIST)); type(Node) = type; data(Node) = d; rest(Node) = L; return Node; } void print_ll(list L) { printf("("); for (; L != NULL; L = rest(L)) { if (type(L) == TYPE_CHAR) { printf(" %c", *(char *)data(L)); } else if (type(L) == TYPE_LIST) { printf(" "); // 遇到子链表递归调用打印函数 print_ll((list)data(L)); } } printf(" )"); }
运行后输出为(a (b c) d e),完全符合预期。
内容的提问来源于stack exchange,提问作者Nielwig
相关产品推荐
相关产品推荐

