《数据结构》代码练习题目【南开大学出版】----图

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;
}
上一篇:【爬虫知识】爬虫常见加密解密算法


下一篇:深度优先搜索非递归实现