/*=============================邻接矩阵的存储结构=============================*/
#include<stdio.h>
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define ADJACENCY 1
#define UNADJACENCY 0
#define NETWORK_INFINITY 32767
#define MAX_VERTEX_NUM 20
int visited[MAX_VERTEX_NUM];
typedef int VRType;
typedef int VertexType;
typedef char InfoType;
typedef enum{ DG,DN,UDG,UDN }GraphKind;
typedef struct ArcCell {
VRType adj;
InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
GraphKind kind;
}AMGraph;
/*============================================================================*/
/* */
/* 顺 序 队 列 */
/* */
/*============================================================================*/
typedef struct{
int data;
}elemtype;
#define QUEUE_MAXSIZE 100
typedef struct{
elemtype elem[QUEUE_MAXSIZE];
int front ,rear;
int length;
}QUEUE;
void queue_init(QUEUE *q)
{
(*q).front=(*q).rear=-1; (*q).length=0;
}
int queue_empty(QUEUE *q)
{
if((*q).length==0) return 1;
else return 0;
}
void queue_push(QUEUE *q,elemtype e)
{
if((*q).length==QUEUE_MAXSIZE) { printf("QUEUE IS FULL"); return ;}
(*q).rear=++(*q).rear%QUEUE_MAXSIZE;
(*q).elem[(*q).rear]=e;
(*q).length++;
if((*q).length==1&&(*q).front==-1) (*q).front=0;
}
void queue_pop(QUEUE *q,elemtype *e)
{
if((*q).length==0) { printf("QUEUE IS EMPTY"); return ;}
*e=(*q).elem[(*q).front++];
(*q).front=(*q).front%QUEUE_MAXSIZE;
(*q).length--;
if((*q).length==0) (*q).front=(*q).rear=-1;
}
void queue_gettop(QUEUE *q,elemtype *e)
{
if((*q).length) *e=(*q).elem[(*q).front];
else printf("QUEUE IS EMPTY");
}
/*========================邻接矩阵的基本操作的实现============================*/
/*-----------------------1、 CreateGraph(&G,V,VR)-----------------------------*/
int CreateGraph( AMGraph *G )
{
int choice;
printf(" 1-Directed Graph /n");
printf(" 2-Directed Network /n");
printf(" 3-UnDirected Graph /n");
printf(" 4-UnDirected Network /n/n");
do{ if(choice<1||choice>4)printf(" Choose: ");scanf("%d",&choice);}
while(choice<1||choice>4);
G->kind = (GraphKind)(choice);
switch(G->kind){
case DG+1: return CreateDG(G);
case DN+1: return CreateDN(G);
case UDG+1: return CreateUDG(G);
case UDN+1: return CreateUDN(G);
default : return ERROR;
}
}
int CreateDG( AMGraph *G )
{
int IncInfo,i,j,k; VertexType v1,v2;
printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
printf(" The Graph's incinfo:"); scanf("%d", &IncInfo); printf("/n");
/*顶点编号或者名称*/
for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
/*初始化邻接矩阵*/
for(i=0;i< G->vexnum ;i++)
for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = UNADJACENCY; (G->arcs)[i][j].info = NULL ; }
/* 构造邻接矩阵 */
for(k = 0;k < G -> arcnum;k ++){
printf("/n The %d Arc ./n",k+1);
printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
i = LocateVex(*G,v1); j = LocateVex(*G,v2);
(G->arcs)[i][j].adj = ADJACENCY;
if(IncInfo){
printf(" Enter %d arc's IncInfo:",k+1);
scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
}
printf("/n");
}
return OK;
}
int CreateDN(AMGraph *G )
{
int IncInfo,i,j,k; VertexType v1,v2,w;
printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
printf(" The Graph's incinfo:"); scanf("%d", &IncInfo); printf("/n");
/*顶点编号或者名称*/
for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
/*初始化邻接矩阵*/
for(i=0;i< G->vexnum ;i++)
for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = NETWORK_INFINITY; (G->arcs)[i][j].info = NULL ; }
/* 构造邻接矩阵 */
for(k = 0;k < G -> arcnum;k ++){
printf("/n The %d Arc ./n",k+1);
printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
printf(" The arc weight:");scanf("%d",&w);
i = LocateVex(*G,v1); j = LocateVex(*G,v2);
(G->arcs)[i][j].adj = w;
if(IncInfo){
printf(" Enter %d arc's IncInfo:",k+1);
scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
}
printf("/n");
}
return OK;
}
int CreateUDG( AMGraph *G )
{
int IncInfo,i,j,k; VertexType v1,v2;
printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
printf(" The Graph's incinfo:"); scanf("%d", &IncInfo); printf("/n");
/*顶点编号或者名称*/
for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
/*初始化邻接矩阵*/
for(i=0;i< G->vexnum ;i++)
for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = UNADJACENCY; (G->arcs)[i][j].info = NULL ; }
/* 构造邻接矩阵 */
for(k = 0;k < G -> arcnum;k ++){
printf("/n The %d Arc ./n",k+1);
printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
i = LocateVex(*G,v1); j = LocateVex(*G,v2);
(G->arcs)[i][j].adj = ADJACENCY;
if(IncInfo){
printf(" Enter %d arc's IncInfo:",k+1);
scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
}
(G->arcs)[j][i] = (G->arcs)[i][j];
printf("/n");
}
return OK;
}
int CreateUDN( AMGraph *G )
{
int IncInfo,i,j,k;
VertexType v1,v2,w;
printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
printf(" The Graph's incinfo:"); scanf("%d", &IncInfo); printf("/n");
/*顶点编号或者名称*/
for(i = 0;i < G -> vexnum ;i ++){
printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i);
}
/*初始化邻接矩阵*/
for(i=0;i< G->vexnum ;i++)
for(j=0;j< G->vexnum ;j++){
(G->arcs)[i][j].adj = NETWORK_INFINITY; (G->arcs)[i][j].info = NULL ;
}
/* 构造邻接矩阵 */
for(k = 0;k < G -> arcnum;k ++){
printf("/n The %d Arc ./n",k+1);
printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
printf(" The arc weight:");scanf("%d",&w);
i = LocateVex(*G,v1); j = LocateVex(*G,v2);
(G->arcs)[i][j].adj = w;
if(IncInfo){
printf(" Enter %d arc's IncInfo:",k+1);
scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
}
(G->arcs)[j][i] = (G->arcs)[i][j];
printf("/n");
}
return OK;
}
/*----------------------------3、 LocateVex(G,u)------------------------------*/
int LocateVex( AMGraph G,VertexType u )
{
int ivex;
for(ivex = 0;ivex < G.vexnum ;ivex ++)
if(u == G.vexs[ivex])
return ivex;
return ERROR;
}
/*------------------------6、 FirstAdjVex(G,v)----------------------------*/
/*操作结果: 返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回“空”。*/
int FirstAdjVex(AMGraph G,int ivex)
{
int jvex;
for(jvex =0;jvex < G.vexnum;jvex ++)
if(G.arcs[ivex][jvex].adj == ADJACENCY) return jvex;
if(jvex >= G.vexnum) return ERROR;
}
/*-------------------------7、 NextAdjVex(G,v,w)----------------------------*/
/*操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接顶点,则返回“空”。 */
int NextAdjVex(AMGraph G,int ivex ,int jw)
{
for(jw +=1 ;jw < G.vexnum;jw ++)
if(G.arcs[ivex][jw].adj == ADJACENCY) return jw;
if(jw >= G.vexnum) return ERROR;
}
/*--------------------------11、深度优先遍历---------------------------------*/
/* int visited[MAX_VERTEX_NUM] */
void VisitFunc(AMGraph G,int v)
{
printf("%6d",G.vexs[v]);
}
void DFS( AMGraph G,int v )
{
int w;
visited[v] = TRUE; VisitFunc(G,v);
for(w = FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
if(!visited[w]) DFS(G,w);
}
void DFSTraverse( AMGraph G,int v )
{
for(v=0;v<G.vexnum;v++) visited[v] = FALSE;
for(v=0;v<G.vexnum;v++)
if(!visited[v]) DFS(G,v);
}
/*-------------------------- 12、广度优先遍历----------------------------------*/
void BFSTraverse(AMGraph G)
{
int v,u,w; QUEUE Q;elemtype e1,e2,e3;
for(v=0;v<G.vexnum;v++) visited[v] = FALSE;
queue_init(&Q);
for(v = 0;v<G.vexnum;v++)
if(!visited[v])
{
visited[v]=TRUE; VisitFunc(G,v);
e1.data = v;
queue_push(&Q,e1);
while(!queue_empty(&Q))
{
queue_pop(&Q,&e2); u = e2.data;
for(w = FirstAdjVex(G,u);w >= 0;w=NextAdjVex(G,u,w))
if(!visited[w])
{
visited[w]=TRUE;VisitFunc(G,w);
e3.data =w;queue_push(&Q,e3);
}/* if */
}/* while */
}/* if */
}
/*============================================================================*/
/*============================主函数main()====================================*/
int main( void )
{
int i,j,ivex;
AMGraph G;
CreateGraph( &G );
printf("The Adjacency Matrix is:/n");
for(i = 0;i < G.vexnum;i ++){
for(j = 0;j < G.vexnum;j ++)
printf("%6d",G.arcs[i][j].adj);
printf("/n");
}
printf("/nDFSTraverse AMGraph:/n");
DFSTraverse(G,ivex);
printf("/nBFSTraverse AMGraph:/n");
BFSTraverse(G);
getch();
}