BFS
算法:
#define MAXSIZE 100bool visited[MAXSIZE]; //访问数组,用来记录各个顶点是否被访问过;//v: 调用本函数,用来访问第v个顶点的下标;void BFS(Graph G, int v){//定义一个指向边表的临时指针:ArcNode *p;//初始化队列:InitQueue(Q);//访问: 伪代码 E.g printfvisit(v);//表示下标为v对应的顶点被访问过了:visited[v] = TRUE;//入队: 目的是在下面的循环中遍历该v对应的结点对应的所有结点EnQueue(Q,v);//如果队列不为空://该队列存在的意义:将队列中每个顶点对应的下个顶点的所有结点访问完毕while(!isEmpty(Q)){//出队: 将队列中存放的结点所在的数组中的下标给临时变量v.DeQueue(Q,v);//获取图G中数组adjList下标为v值的顶点的第1条边,把该边的地址赋值给临时变量p:p = G->adjList[v].firstedge;//如果该p指向的顶点的地址存在:while(p){//如果该p指向的顶点对应的visited数组对应的标记不是0(即没有被访问)的话:if(!visited[p->adjvex]){//访问:visit(p->adjvex);//标记该顶点访问过了:visted[p->adjvex] = TRUE;//将该顶点入栈: 实际上最坏的情况,将连通图中每个有关系的结点都入队了 ^_^EnQueue(Q,p->adjvex);}//让p指向当前顶点的下个顶点:p = p->next;}}}
举例:

DFS
#define MAXSIZE 100bool visited[MAXSIZE]; //访问数组,用来记录各个顶点是否被访问过;//v: 调用本函数,用来访问第v个顶点的下标;void DFS(Graph G, int v){//定义一个指向边表的临时指针:ArcNode *p;//初始化队列:InitQueue(Q);//访问: 伪代码 E.g printfvisit(v);//表示下标为v对应的顶点被访问过了:visited[v] = TRUE;p=G->adjlist[v].firstarc; //指针p开始指向该顶点的第一条边//如果p指向的结点地址存在的话:while(p!=NULL){//没遍历完顶点的所有邻接顶点:if(!visited[p->adjvex]){//如果该顶点没被访问,那么就递归访问该顶点DFS(G,p->adjvex);}p=p->nextarc; //看还有没有其他未访问的顶点}}
void DFSTraverse(Graph G){int i; //单独定义是为了方便多个循环中使用for(i=0; i<G->vexnum; i++){visited[i]=false; //将标志数组初始化 (全局数组)}for(i=0; i<G->vexnum; i++){if(!visited[i]){DFS(G,i); //对所有}}}

