《数据结构》代码练习题目【南开大学出版】----图
作者:互联网
1、图的打印,深度遍历,广度遍历,是否联通,几个联通变量
# include <stdio.h>
# include <malloc.h>
# include <string.h>
#define vnum 20 //最大顶点数设为20
int visited[vnum]; /*结点被访问标志数组*/
typedef struct node /*表结点的结构体*/
{
int adjvex; /*邻接点域*/
struct node *nextarc; /*指向下一个结点的指针域*/
}arcnode;
typedef struct vnode /*表头结点的结构体*/
{
char vertex;
arcnode *firstarc; /*表头指针*/
}vexnode;
typedef struct
{
vexnode adjlist[vnum]; /*邻接表*/
int vexnum, arcnum; /*顶点数和边数*/
}graph;
/*--------------无向图(有向图)的邻接表的创建-----------------*/
void create(graph *g,int edge[][2])
{
int i,m,n;
arcnode *p;
printf("请输入顶点信息:");
for(i=0;i<g->vexnum;i++)
{
scanf("%c",&g->adjlist[i].vertex);
g->adjlist[i].firstarc=NULL;
}
for(i=0;i<g->arcnum;i++)
{
m=edge[i][0];
n=edge[i][1];
p=(arcnode*)malloc(sizeof(arcnode));
p->adjvex=n;
p->nextarc=g->adjlist[m].firstarc;
g->adjlist[m].firstarc=p;
}
}
/******打印图的邻接表******/
void disp(graph *g)
{
int i;
arcnode *p;
printf("输出图的邻接表表示:\n");
for(i=0;i<g->vexnum;i++)
{ p=g->adjlist[i].firstarc;
printf("%d:%c -->",i,g->adjlist[i].vertex);
while(p!=NULL)
{
printf(" %d -->",p->adjvex);
p=p->nextarc;
}
printf(" Λ\n");
}
}
/******图的深度优先遍历******/
void dfs(graph *g, int v)
{
arcnode *p;
printf("%c",g->adjlist[v].vertex);
visited[v]=1;
p=g->adjlist[v].firstarc;
while(p)
{
if(!visited[p->adjvex])
dfs(g,p->adjvex);
p=p->nextarc;
}
}
void dfst(graph *g)
{
int i,n=0;
for(i=0;i<g->vexnum;i++)
{
visited[i]=0;
}
for(i=0;i<g->vexnum;i++)
{
if(!visited[i])
{
dfs(g,i);
n++;
}
}
if(n==1)
printf("\t该图是连通图");
else
printf("\t该图不是连通图,连通分量是%d\n",n);
}
/******图的广度度优先遍历******/
void bft(graph *g,int v) //从v出发,广度优先遍历图G的一个连通分量。
{
int q[20],r=0,f=0;
arcnode *p;
if(visited[v]==0)
{
visited[v]=1;
printf("%c",g->adjlist[v].vertex);
q[f++]=v;
while(r!=f)
{
p=g->adjlist[q[r]].firstarc;
r++;
while(p!=NULL)
{
if(visited[p->adjvex]==0)
{
printf("%c",g->adjlist[p->adjvex].vertex);
visited[p->adjvex]=1;
}
q[f++]=p->adjvex;
p=p->nextarc;
}
}
}
}
void bfst(graph *g)
{
int i,n=0;
for(i=0;i<g->vexnum;i++)
{
visited[i]=0;
}
for(i=0;i<g->vexnum;i++)
{
if(!visited[i])
{
bft(g,i);
n++;
}
}
if(n==1)
printf("\t该图是连通图");
else
printf("\t该图不是连通图,连通分量是%d\n",n);
}
/******主函数******/
int main()
{
graph g;
int v,e;
int edge[][2]={{0,2},{1,4},{1,3},{2,5},{2,4},{3,7},{3,6},{4,8},{4,7},{5,7},{6,7},{7,8}};
printf("请输入顶点数:");
scanf("%d",&v);
printf("请输入边数:");
scanf("%d",&e);
getchar();
g.vexnum=v;
g.arcnum=e;
create(&g,edge);
disp(&g);
bfst(&g);
dfst(&g);
return 0;
}
标签:adjlist,int,----,++,adjvex,printf,visited,南开大学,数据结构 来源: https://blog.csdn.net/weixin_51800958/article/details/121054222