如何将这段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
相关产品推荐
相关产品推荐

