给定一个有向图,其邻接表结构如下定义:`typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; }ArcNode; typedef struct VNode{ char data; ArcNode *firstarc; }VNode; typedef struct{ VNode vertices[MAX_VERTEX_NUM]; int vexnum,arcnum; }ALGraph;`,现有操作`q=G.vertices[i].firstarc; for(q=G.vertices[i].firstarc;q->nextarc;q=q->nextarc); q->nextarc=p;`,其目的是在顶点`i`的邻接表中添加新边。假设顶点`i`的邻接表已经存在多个邻接点,且`p`指向新分配的弧节点,则这段操作的正确描述是:
答案解析
核心考点说明: 链表的尾插法、邻接表结构。
解题思路分析: 代码片段的核心在于遍历顶点`i`的邻接表,找到最后一个节点,然后将新节点`p`链接到其后。循环条件 `q->nextarc` 表示当 `q->nextarc` 为 `NULL` 时,循环结束,此时`q`指向最后一个节点。`q->nextarc=p` 执行后,新节点`p`就成为了最后一个节点,实现了尾插法。
选项分析:
A. 错误。代码的循环目的是寻找链表尾部,而非头部。
B. 正确。代码逻辑是寻找链表尾部并插入新节点,符合尾插法的定义。
C. 错误。循环结束后,`q`指向的是链表尾部,插入位置确定。
D. 错误。代码逻辑清晰,使用循环找到最后一个节点,保证了新节点插入的正确性,不会导致节点丢失。
易错点提醒: 注意循环的判断条件 `q->nextarc`,它决定了循环结束时 `q` 指向的是最后一个节点,而不是倒数第二个节点。容易误认为是在链表中间位置插入。
正确答案:B