//图的 深度遍历
//预先定义好的数据结构
//s : 表示顺序栈
//t : 表示栈顶指针
void dfs(int x)
{//从第x元素还是深度遍历
int mark[n0+1]; //mark[i] = 0 表示这个点还没有被访问过
int k; //用于遍历
int s[n0+1],t;
arcnode *p;
//初始化
for(k=0;k<=n;k++)
{
mark[k] = 0;
}
cout<<x<<” “;
mark[x] = 1;
//初始化栈
t=1;
s[1] = x; //
do
{
k = s[t]; //得到栈顶元素所指节点
p = adjlist[k].first; //p为与k连接的边的节点
while(p && mark[p->vertext])
{//如果p不空,而且当前p所指节点已经被访问,就继续找和k连接的节点。
p = p->next;
}
if(p == NULL)
{//如果和k邻接的节点都已经被访问过了,出栈
t–;
}
else
{//如果和k邻接的节点还有没有被访问的,就访问
x = p->vertext; //x是这个没被访问过的节点
cout<<x<<” “; //访问x
mark[x] = 1 ; //标记x也被访问过
s[++t] = x; //x被入栈
}
} while (t);
}
//图的 广度遍历
//预先定义好的数据结构
//q : 顺序队列
// f,r :队列首指针,队列尾指针
void bfs(int x)
{//从第x节点开始访问
int mark[n0+1]; //标志点是否被访问过
int k;
int q[n0+1]; //队列
int f; //队列头
int r; //队列尾
arcnode* p; //临时的边节点
//初始化mark数组
for(k=1;k<=n;k++)
{
mark[k] = 0;
}
cout<<x<<” “; //从x节点开始广度遍历
mark[x] = 1;
f = 1; //头指针,删除的位置
r = 2; //尾指针,插入的位置
q[f] = x; //插入队列
do
{
k = q[f++]; //k为当前正在访问的节点,f头指针移动到正确的位置
p = adjlist[k].first; //得到跟当前节点连接的第一条边
while(p)
{//当这条边不为空
x = p->vertext; //得到这条边上的节点
if(mark[k] == 0)
{//如果这个节点还没有被访问
cout<<x<<” “; //访问这个节点
mark[x] = 1; //设置这个节点被访问
q[r++] = x; //插入队列
}
p = p->next;
}
} while (f!=r); //当队列不为空
}