实验:图的应用

算法1:输入图的类型、顶点数、狐(边)数、顶点信息、狐(边)信息,建立相应的图(具体类型可以是无向图、有向图、无向网、有向网,采用邻接矩阵存储结构);分别按深度优先搜索和广度优先搜索遍历图;按某种形式输出图及遍历结果。

实验源代码
#include <stdio.h>   
#include <stdlib.h>
#define OVERFLOW -2         
#define ILLEGAL -1         
#define OK 1                
#define ERROR 0
#define MAXQSIZE 100       
typedef int QElemType;
typedef int Status;       
typedef float ElemType;
#define INFINITY        65535    
#define MAX_VERTEX_NUM  20//最大顶点个数
typedef enum {DG,UDG} GraphKind;//(有向图,无向图)
typedef int VRType;
typedef int VertexType;
typedef struct ArcCell{
VRType   adj; 
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; 
typedef struct{
VertexType vexs[MAX_VERTEX_NUM];//顶点向量
AdjMatrix  arcs;//邻接矩阵
int vexnum,arcnum;//图当前的定点数和弧数
GraphKind  kind;     
}MGraph; 
int LocateVex(MGraph G, int v){  
for(int i=0;i<=G.vexnum;++i)
if(G.vexs[i]==v)  
return i;   
return -1;  
}
Status CreateDG(MGraph &G){
//采用数组(邻接矩阵)表示法,构造有向图G 
VertexType v1,v2;
int i,j;
printf("请依次输入有向图G的顶点数,弧数,用空格隔开\n");
scanf("%d %d",&G.vexnum,&G.arcnum);
printf("请依次输入有向图G的顶点名称,用空格隔开\n"); 
for(int i=0;i<G.vexnum;++i)
scanf("%d",&G.vexs[i]);  
for(int i=0;i<G.vexnum;++i)
    for(int j=0;j<G.vexnum;++j)
      G.arcs[i][j].adj=0; 
printf("请依次输入有向图G每条弧依附的两顶点名称,输完一组按回车\n"); 
for(int k=0;k<G.arcnum;++k){ 
scanf("%d",&v1);
scanf("%d",&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);    
G.arcs[i][j].adj=1;
}
return OK; 
}
Status CreateUDG(MGraph &G){
//采用数组(邻接矩阵)表示法,构造无向图G 
VertexType v1,v2;
int i,j;
printf("请依次输入无向图G的顶点数,弧数,用空格隔开\n");
scanf("%d %d",&G.vexnum,&G.arcnum);
printf("请依次输入无向图G的顶点名称,用空格隔开\n"); 
for(int i=0;i<G.vexnum;++i)
scanf("%d",&G.vexs[i]);   
for(int i=0;i<G.vexnum;++i)
for(int j=0;j<G.vexnum;++j)  
G.arcs[i][j].adj=0; 
printf("请依次输入无向图G每条弧依附的两顶点名称,输完一组按回车\n"); 
for(int k=0;k<G.arcnum;++k){  
scanf("%d",&v1);
scanf("%d",&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);      
G.arcs[i][j].adj=1;
G.arcs[j][i]=G.arcs[i][j];  
}
return OK; 
}
Status CreateGraph(MGraph &G){  
//采用数组(邻接矩阵)表示法,构造图G
printf("请输入您想构造的图的类型:有向图,无向图,分别对应0,1");
int temp; 
scanf("%d",&temp);  
G.kind=(GraphKind)temp;
switch((GraphKind)temp){
case  DG:  return CreateDG(G);  
case UDG:  return CreateUDG(G);
default:  return ERROR;
} 
}
Status PrintAdjMatrix(MGraph G){  
//采用数组(邻接矩阵)表示法,构造图G
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++)
printf(" %3d ", G.arcs[i][j].adj);
printf("\n\n");
}  
}
int FirstAdjVex(MGraph G,VertexType v){
//求顶点v在图G中的第一个邻接点
int i,j=0,k;
k=LocateVex(G,v); 
for(i=0;i<G.vexnum;++i)
if(G.arcs[k][i].adj!=j)
return i;        
return -1;             
}
int NextAdjVex(MGraph G,VertexType v,VertexType w){ 
int i,j=0,k1,k2;
k1=LocateVex(G,v);  
k2=LocateVex(G,w);  
for(i=k2+1;i<G.vexnum;++i)
if(G.arcs[k1][i].adj!=j)
return i;       
return -1;            
}
typedef enum { TRUE=1 , FALSE=0 } Boolean; 
Boolean visited[MAX_VERTEX_NUM];    
Status (*VisitFunc)(int v);        
Status Print(int v){  
printf("%3d",v);
return OK;
}
void DFSTraverse(MGraph G,Status (*Visit)(int v)){
//对图G作深度优先遍历
void DFS(MGraph G,int v);   
VisitFunc=Visit;         
for(int v=0;v<G.vexnum;++v)
visited[v]=FALSE;    
for(int v=0;v<G.vexnum;++v)
if(!visited[v])   
DFS(G,v); 
}
void DFS(MGraph G,int v){
//从第v个顶点出发递归地深度优先遍历图G
visited[v]=TRUE;    
VisitFunc(G.vexs[v]);   
for(int w=FirstAdjVex(G,G.vexs[v]);w>=0;w=NextAdjVex(G,G.vexs[v],G.vexs[w])){
if(!visited[w])
DFS(G,w);    
}
}
typedef struct              
{
QElemType *base;        
int front;              
int rear;              
}SqQueue; 
Status InitQueue_Sq(SqQueue &Q) 
{   
if(!(Q.base=(QElemType *)malloc(sizeof(QElemType)))){
printf("内存分配失败,程序即将退出!\n");
exit(OVERFLOW);
}
Q.front=Q.rear=0;
return OK;
}
Status DestoryQueue_Sq(SqQueue &Q)
{   
free(Q.base); 
Q.base=NULL;
printf("循环队列已成功销毁!\n");
return OK;
}
Status QueueEmpty_Sq(SqQueue Q)
{  
if(Q.rear==Q.front) 
return OK; 
else
return ERROR; 
}
Status EnQueue_Sq(SqQueue &Q,QElemType e)
{   
if((Q.rear+1)%MAXQSIZE==Q.front)  
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;   
return OK; 
}
Status DeQueue_Sq(SqQueue &Q,QElemType &e)
{   
if(Q.front==Q.rear) 
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;  
return OK; 
} 
void BFSTraverse(MGraph G,Status (*Visit)(int v)){
//按广度优先非递归遍历图G,
SqQueue Q; 
for(int v=0;v<G.vexnum;++v)
visited[v]=FALSE;    
InitQueue_Sq(Q);          
for(int v=0;v<G.vexnum;++v)
if(!visited[v]){        
visited[v]=TRUE;  
Visit(G.vexs[v]);   
EnQueue_Sq(Q,v);    
while(!QueueEmpty_Sq(Q)){    
DeQueue_Sq(Q,v);      
for(int w=FirstAdjVex(G,G.vexs[v]);w>=0;w=NextAdjVex(G,G.vexs[v],G.vexs[w])){ 
        if(!visited[w]){   
           visited[w]=TRUE;  
                Visit(G.vexs[w]);    
      }
    } 
   }
  }
}
int main(int argc,char *argv[]){
MGraph G; 
CreateGraph(G);      
printf(" 图的邻接矩阵:\n\n"); 
PrintAdjMatrix(G);   
printf("图的遍历:\n");
printf("深度优先遍历结果:");
DFSTraverse(G,Print);
printf("\n广度优先遍历结果:");
BFSTraverse(G,Print); 
return 0;
} 

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cai-4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值