c语言之有向图无向图学习

#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 40
typedef int DataType;

int visited[MAXNUM]={0};//访问节点标识
int vexInNum[MAXNUM]={0};//统计节点的入度


//无向图 测试数据 8 0 1 0 2 0 3 1 2 1 4 2 5 3 1 3 6 4 0 4 1 4 6 6 4 6 7 7 6 -1 -1
//有向图 测试数据 需是无环图 做拓扑排序 5 2 0 2 1 0 1 0 4 1 3 4 3 -1 -1
/*图的邻接矩阵结构*/

typedef struct
{
	int vexnum;//顶点个数
	int arcs[MAXNUM][MAXNUM];//邻接矩阵
}MGraph,*PMGraph;
/*队列的定义用于广度优先遍历*/

typedef struct{
	int front;//头指针
	int rear;//尾指针
	int count;//计数器
	DataType data[MAXNUM];
}CirQueue,*PCirQueue;
//初始化
void initQueue(PCirQueue q)
{
	q->front=q->rear=0;
	q->count=0;
}
//判定队空
int emptyQueue(PCirQueue q)
{
	return q->count==0;
}
//判定队满
int fullQueue(PCirQueue q)
{
	return q->count==MAXNUM;
}
//入队
void entryQueue(PCirQueue q,DataType x)
{
	if(fullQueue(q))
	{
		printf("队列已满\n");
		exit(1);
	}
	q->count++;
	q->data[q->rear]=x;
	q->rear=(q->rear+1)%MAXNUM;
}
//出队 返回出来的元素
DataType deleteQueue(PCirQueue q)
{
	DataType temp;
	if(emptyQueue(q))
	{
		printf("队已经为空\n");
		exit(1);
	}
	q->count--;
	temp=q->data[q->front];
	q->front=(q->front+1)%MAXNUM;
	return temp;
}



/*图的初始化*/
void initGraph(PMGraph g)
{
	int i,j,k;
	printf("输入顶点个数:\n");//校验输入的顶点个数
	scanf("%d",&k);
	g->vexnum=k;
	//初始化边信息
	for(i=0;i<k;i++)
		for(j=0;j<k;j++)g->arcs[i][j]=0;
	printf("输入边信息:\n");
	while(1)
	{
		scanf("%d%d",&i,&j);
		if(i==-1&&j==-1)break;
		g->arcs[i][j]=1;
	}
}
/*图的邻接矩阵*/
void outPutGraph(PMGraph g)
{
	int i,j,k;
	k=g->vexnum;
	for(i=0;i<k;i++)
	{
		for(j=0;j<k;j++)
		{
			printf("%-3d",g->arcs[i][j]);
		}
		printf("\n");
	}
}
/*拓扑排序---参考深度优先遍历思路*/
void topSort(PMGraph g,int i)
{
	int j;
	printf("V%d ",i);
	visited[i]=1;
	//去掉i 到j的入度
	for(j=0;j<g->vexnum;j++)
	{
		if(g->arcs[i][j]==1)
		{
			vexInNum[j]-=1;
		}
		if(vexInNum[j]==0&&visited[j]==0)topSort(g,j);
	}
}
void topTraver(PMGraph g)
{
	int i,j;
	//初始化入度点数
	for(i=0;i<g->vexnum;i++)
	{
		vexInNum[i]=0;	visited[i]=0;
	}
	//统计图g的各个节点的入度 数组下标标示节点 数组值表示入度数
	for(i=0;i<g->vexnum;i++)
	{
		for(j=0;j<g->vexnum;j++)
		{
			if(g->arcs[j][i]==1)vexInNum[i]+=1;
		}
	}
	for(i=0;i<g->vexnum;i++){
		if(vexInNum[i]==0&&visited[i]==0)
		{
			topSort(g,i);
		}
	}
}

/*深度优先搜索DFS*/
void DFS(PMGraph g,int i)
{
	int j;
	//打印表示已访问
	printf("V%d ",i);
	visited[i]=1;
	for(j=0;j<g->vexnum;j++)
	{
		if(g->arcs[i][j]==1&&!visited[j])DFS(g,j);
	}
}
void DFSTraver(PMGraph g)
{
	int i;
	//初始化访问节点
	for(i=0;i<g->vexnum;i++)visited[i]=0;
	for(i=0;i<g->vexnum;i++)
	{
		if(!visited[i])
		{
			DFS(g,i);
		}
	}
}
/*广度优先搜索BFS 使用队列遍历*/
void BFS(PMGraph g,int i)
{
	CirQueue q;
	int j;
	printf("V%d ",i);
	visited[i]=1;
	initQueue(&q);//初始化队列
	entryQueue(&q,i);
	while(!emptyQueue(&q))
	{
		int v=deleteQueue(&q);
		for(j=0;j<g->vexnum;j++)
		{
			if(g->arcs[v][j]==1&&visited[j]==0)
			{
				printf("V%d ",j);
				visited[j]=1;
				entryQueue(&q,j);
			}
		}
	}
}

void BFSTraver(PMGraph g)
{
	int i;
	//初始化访问节点
	for(i=0;i<g->vexnum;i++)visited[i]=0;
	for(i=0;i<g->vexnum;i++)
	{
		if(!visited[i])
		{
			BFS(g,i);
		}
	}
}

/*最小生成树*/
void main()
{
	MGraph *g = (PMGraph)malloc(sizeof(MGraph));
	initGraph(g);
	printf("图的邻接矩阵:\n");
	outPutGraph(g);
	printf("图的深度优先遍历:\n");
	DFSTraver(g);
	printf("\n图的拓扑排序:\n");
	topTraver(g);
	printf("\n图的广度优先遍历:\n");
	BFSTraver(g);
}

你可能感兴趣的:(c语言之有向图无向图学习)