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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值