问题结果截图:
void dfs (Agraph G, int v) {
printf("%c--",G.adjlist[v].data); /* 访问顶点v*/
G.adjlist[v].tag=1; /* 顶点v 的访问标志置为1*/
arcnode *p=G.adjlist[v].firstarc; /*p[v] 指向与顶点v 相关联的第一条边的结点*/
while(p!=NULL){
int w=p->adjvex; /* 读取到与v 相邻接的顶点w*/
if(G .adjlist[w].tag==0) /* 如果顶点w 未被访问*/
dfs(G,w); /* 从顶点w 出发,继续对G 进行深度优先遍历*/
p=p->nextarc;
}
}
按步debug,递归时,当遍历完所有结点后tag由1变为0,导致标记失效.
解决:应该取Agraph G的地址. 想问问这究竟是为什么?求大佬教我~
找到了答案:没有&符号时,每次调用dfs函数,都是对Agraph g的复制,没有改变原始的Agraph g.
以后每次有对结构体,数据做出改变时,都应该获取原始地址,对原始结构体,数据进行操作.
符合要求的代码(只加了&符号)
void dfs (Agraph &G, int v) {
printf("%c--",G.adjlist[v].data); /* 访问顶点v*/
G.adjlist[v].tag=1; /* 顶点v 的访问标志置为1*/
arcnode *p=G.adjlist[v].firstarc; /*p[v] 指向与顶点v 相关联的第一条边的结点*/
while(p!=NULL){
int w=p->adjvex; /* 读取到与v 相邻接的顶点w*/
if(G .adjlist[w].tag==0) /* 如果顶点w 未被访问*/
dfs(G,w); /* 从顶点w 出发,继续对G 进行深度优先遍历*/
p=p->nextarc;
}
}