You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:06:03