最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。
希望这些能提供给初学者一些参考。
1.连通图的深度优先搜索
//以邻接矩阵作为图的存储结构的深度优先遍历算法
int visited[MaxSize]={0};
void DFS1(AdjMatrix *g, int i)
{
printf("%3c",g->vexs[i]);
visited[i]=1;
for(j=0;j<g->vexnum;j++)
if((1==g->arcs[i][j]) && (!visited[j]))
DFS1(g,j);
}
//以邻接表作为图的存储结构的深度优先遍历算法
int visited[MaxSize]={0};
void DFS2(AdjList *g, int i)
{
printf("%3c",g->vertex[i].data);
visited[i]=1;
for(p=g->vertex[i].firstarc;p;p=p->nextarc)
if(!visited[p->adjvex])
DFS2(g,p->adjvex);
}
2.连通图的广度优先搜索
//以邻接矩阵作为图的存储结构的广度优先遍历算法
int visited[MaxSize]={0};
void BFS1(AdjMatrix g, int i)
{
int k;
Queue Q;
printf("%3c",g.vex[i]); //开始的点
visited[i]=1;
InitQueue(&Q);
EnQueue(&Q,i); //i入队列
while(!Empty(Q))
{
DeQueue(&Q,&k); //队头结点出队列
for(j=0;j<g.vexnum;j++)
if((1==g.arcs[k][j]) && (!visited[j]))
{
printf("%3c",g.vexs[j]);
visited[j]=1;
EnQueue(&Q,j);
}
}
}
//以邻接表作为图的存储结构的广度优先遍历算法
int visited[MaxSize]={0};
void BFS2(AdjList g, int i)
{
int k;
ArcNode *p;
Queue Q;
printf("%3c",g.vertex[i].data); //开始的点
visited[i]=1;
InitQueue(&Q);
EnQueue(&Q,i); //i入队列
while(!Empty(Q))
{
DeQueue(&Q,&k); //队头结点出队列
p=g.vertex[k].firstarc;
while(p)
{
if(!visited[p->adjvex])
{
printf("%3c",g.vertex[p->adjvex]);
visited[p->adjvex]=1;
EnQueue(&Q,p->adjvex);
}
p=p->nextarc;
}
}
}
3.非连通图的深度优先搜索遍历
void DFSUnG(AdjMatrix *g)
{
int i;
for(i=0;i<g->vexnum;i++)
if(!visited[i])
DFS(g,i);
}