图的基本算法实现(邻接矩阵与邻接表两种方法)
本博客前面文章已对图有过简单的介绍,本文主要是重点介绍有关图的一些具体操作与应用
阅读本文前,可以先参考本博客
各种基本算法实现小结(四)—— 图及其遍历
一、无向图
1 无向图——邻接矩阵
测试环境:VS2008
运行结果:
==========================================================
2
无向图——
邻接表
测试环境:VS2008
printf("Enter %d vexnum.../n", g.vexnum);
for(i=1; i<=g.vexnum; i++)
{
printf("vex %d: ", i);
scanf("%c", &g.AdjList[i].adjvex);
getchar();
g.AdjList[i].firstarc=NULL;
}
printf("Enter arc.../n");
for(i=1; i<=g.arcnum; i++)
{
printf("arc %d: ", i);
scanf("%c %c", &ch1, &ch2);
getchar();
p1=locate(g, ch1);
p2=locate(g, ch2);
pnode1=(pArcNode)malloc(sizeof(ArcNode));
pnode2=(pArcNode)malloc(sizeof(ArcNode));
pnode1->ivex=p2; /* next ivex */
pnode1->nextarc=g.AdjList[p1].firstarc;
g.AdjList[p1].firstarc=pnode1;
pnode2->ivex=p1; /* next ivex */
pnode2->nextarc=g.AdjList[p2].firstarc;
g.AdjList[p2].firstarc=pnode2;
}
return g;
}
int firstvex_graph(ALGraph g, int i)
{
int k;
if(i>=1 && i<=g.vexnum)
if(g.AdjList[i].firstarc)
return g.AdjList[i].firstarc->ivex;
return -1;
}
int nextvex_graph(ALGraph g, int i, int k)
{
pArcNode pnode;
if(i>=1 && i<=g.vexnum && k>=1 && k<=g.vexnum)
{
pnode=g.AdjList[i].firstarc;
while(pnode->nextarc)
{
k=pnode->nextarc->ivex;
if(!visited[k])
return k;
else
pnode=pnode->nextarc;
}
}
return -1;
}
void dfs(ALGraph g, int i)
{
int k;
if(!visited[i])
{
visited[i]=1;
printf("%c", g.AdjList[i].adjvex);
for(k=firstvex_graph(g, i); k>=1; k=nextvex_graph(g, i, k))
if(!visited[k])
dfs(g, k);
}
}
void dfs_graph(ALGraph g)
{
int i;
visited=(int *)malloc((g.vexnum+1)*sizeof(int));
for(i=1; i<=g.vexnum; i++)
visited[i]=0;
for(i=1; i<=g.vexnum; i++)
if(!visited[i])
dfs(g, i);
}
int _tmain(int argc, _TCHAR* argv[])
{
ALGraph g;
g=create_graph();
dfs_graph(g);
printf("/n");
return 0;
}
运行结果:
==========================================================
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2010-06-21 12:15:40
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!