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

如何将这段C++邻接表遍历代码转为C语言?请求验证手写代码

你的C语言遍历代码问题分析与修正

嘿,我来帮你排查这段代码的问题~首先你的思路方向是对的,但有个关键的错误:你在遍历过程中直接修改了graph->adjLists[src]这个原邻接表的头指针,遍历完成后,这个顶点对应的邻接链表头会指向最后一个节点,后续再想访问该顶点的邻接表时,就找不到完整的链表结构了!

先看你原代码的问题点

// 问题:修改了原邻接表的头指针,破坏链表结构,还会漏掉第一个节点
while (graph->adjLists[src]->next != NULL) {
    int i = graph->adjLists[src]->vertex;
    if (!visited[i]) {
        // Do Something
    }
    graph->adjLists[src] = graph->adjLists[src]->next; // 这里修改了原链表头
}

另外这段代码的循环条件next != NULL还会导致漏掉邻接表的第一个节点(如果链表只有一个节点,循环根本不会执行)。

正确的C语言实现方式

我们需要用一个临时指针来遍历邻接链表,这样既不会改动原链表的头指针,又能完整遍历所有邻接顶点:

// 遍历当前顶点src的所有邻接顶点
struct AdjNode* temp = graph->adjLists[src]; // 临时指针指向邻接表头部
while (temp != NULL) {
    int neighbor = temp->vertex;
    if (!visited[neighbor]) {
        // Do Something(比如递归访问、记录路径等)
    }
    temp = temp->next; // 移动临时指针到下一个节点
}

这个写法和你原来的C代码逻辑完全对应:C里用迭代器遍历list不会修改原容器,这里用临时指针遍历链表也不会破坏原邻接表结构,而且能遍历到每一个邻接顶点。

内容的提问来源于stack exchange,提问作者Zegna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:52:32