#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXVEX 20 //最大顶点个数
#define INFINTY -1 //表示无穷
//∞无穷
typedef struct{
int arcs[MAXVEX][MAXVEX];//边(弧)信息
char vex[MAXVEX]; //顶点信息
int vexnum;//顶点数目
int arcnum;//边(弧)数目
}Adjmatrim; //领接矩阵 (数组表示法)
typedef struct {
int in;
int out;
int total;
}Degree[MAXVEX];
typedef struct{
int vex[MAXVEX];
int front;
int rear;
}*QUEQUE,QUEQUE_1;
int visited[MAXVEX]={0};
Adjmatrim *Create_Adjmatrim(); //创建无向图
void Create(Adjmatrim *G); //创建图
int Locate(Adjmatrim *G,char v); //算是否连通
void prinf_Adjmatrim(Adjmatrim *G) ;//输出图
void Calulate_Degree(Adjmatrim *G);//算每一个结点的度并输出
void DFS(Adjmatrim *G,int n);//深度优先遍历连通子图
void TraverseG(Adjmatrim *G);//
int First_Adjmatrim_VEX(Adjmatrim *G,int n);//第一个领接点
int Next_Adjmatrim_vex(Adjmatrim *G,int n,int w);//下一个领接点
void TraverseG_BFS(Adjmatrim *G);//广度优先遍历
void BFS(Adjmatrim *G,int n);//广度优先搜索遍历连通图
QUEQUE Create_QUEQUE();//创建队列
int Empty(QUEQUE Q);//队列判空
void out_QUEQUE(QUEQUE Q,int *w);//出队
void input_QUEQUE(QUEQUE Q,int w);//入队
main()
{
Adjmatrim *G=Create_Adjmatrim();
Create(G);
// prinf_Adjmatrim(G);//输出有向图的领接矩阵
Calulate_Degree(G);//算度
TraverseG(G);//深度优先遍历
printf("\n");
TraverseG_BFS(G);
//算度 测试
/*
int n=0;
int w=4;
printf("%d %c\n",First_Adjmatrim_VEX(G,n),G->vex[First_Adjmatrim_VEX(G,n)]);
printf("%d %c",Next_Adjmatrim_vex(G,n,w),G->vex[Next_Adjmatrim_vex(G,n,w)]);
*/
}
Adjmatrim *Create_Adjmatrim() //创建无向图
{
Adjmatrim *G=(Adjmatrim*)malloc(sizeof(Adjmatrim));
return G;
}
void Create(Adjmatrim *G) //初始化
{
int i,j,k,weight;
char vex1,vex2;
scanf("%d %d",&G->vexnum,&G->arcnum);//输入顶点数目和边数目
for(i=0;i<MAXVEX;i++)
for(j=0;j<MAXVEX;j++)
G->arcs[i][j]=-1; //初始化
char G_vexnum[G->vexnum];
scanf("%s",G_vexnum);
for(i=0;i<G->vexnum;i++)
{
G->vex[i]=G_vexnum[i]; // 初始化G->vexnum个结点
}
for(i=G->vexnum;i<MAXVEX;i++) //其它结点的信息初始化为NULL
{
G->vex[i]=NULL;
}
char vex1_vex2[2];
for(k=0;k<G->arcnum;k++)
{
scanf("%s",vex1_vex2);
vex1=vex1_vex2[0];
vex2=vex1_vex2[1];
i=Locate(G,vex1);
j=Locate(G,vex2);
G->arcs[i][j]=1;
}
}
int Locate(Adjmatrim *G,char v)//寻找位置
{
int i;
for(i=0;i<G->vexnum;i++)
if(G->vex[i]==v)
return i;
return 0;
}
void prinf_Adjmatrim(Adjmatrim *G)
{
int i,j;
printf(" ");
for(i=0;i<G->vexnum;i++)
printf("%c",G->vex[i]);
printf("\n");
for(i=0;i<G->vexnum;i++)
{
printf("%c",G->vex[i]);
for(j=0;j<G->vexnum;j++)
{
if(G->arcs[i][j]==-1)//空
printf("0");
else
printf("%d",G->arcs[i][j]);
}
printf("\n");
}
}
void Calulate_Degree(Adjmatrim *G)
{
int i,j;
Degree A;
int indext;
for(i=0;i<G->vexnum;i++)//算入度
{
indext=0;
for(j=0;j<G->vexnum;j++)
if(G->arcs[i][j]==1)
{
indext++;
}
A[i].out=indext;
}
for(i=0;i<G->vexnum;i++)//算出度
{
indext=0;
for(j=0;j<G->vexnum;j++)
if(G->arcs[j][i]==1)
{
indext++;
}
A[i].in=indext;
}
for(i=0;i<G->vexnum;i++)//算总度
{
A[i].total=A[i].in+A[i].out;
}
for(i=0;i<G->vexnum;i++)
printf("%c %d %d %d\n",G->vex[i],A[i].out,A[i].in,A[i].total);
}
void DFS(Adjmatrim *G,int n)
{
printf("%c",G->vex[n]);
visited[n]=1;
int w=First_Adjmatrim_VEX(G,n);
while(w!=-1)
{
if(!visited[w])
DFS(G,w);
w=Next_Adjmatrim_vex(G,n,w);
}
}
void TraverseG(Adjmatrim *G) //深度优先遍历
{
int i;
for(i=0;i<MAXVEX;i++)
visited[i]=0;
for(i=0;i<G->vexnum;i++)
if(!visited[i])
DFS(G,i);
}
int Next_Adjmatrim_vex(Adjmatrim *G,int n,int w)//寻找下一个结点
{
int i;
int flag=-1;
for(i=w+1;i<G->vexnum;i++)
if(G->arcs[n][i]!=-1 )//
{
flag=i;break;
}
// printf("Next %d\n",flag);
return flag;
}
int First_Adjmatrim_VEX(Adjmatrim *G,int n)//寻找第一个结点
{
int i;
for(i=0;i<G->vexnum;i++)
{
if(G->arcs[n][i]!=-1)
{
// printf("First %d\n",i);
return i;
}
}
}
/*
void BFS(Adjmatrim *G,int v0)
{
int w,v;
QUEQUE Q=Create_QUEQUE();
if(v0<G->vexnum)
printf("%c",G->vex[v0]);
visited[v0]=1;
input_QUEQUE(Q,v0);
while(!Empty(QUEQUE(Q)))
{
out_QUEQUE(Q,&v);
w=First_Adjmatrim_VEX(G,v);
while(w!=-1)
{
if(visited[w]!=1)
{
if(w<G->vexnum)
printf("%c",G->vex[w]);
visited[w]=1;
input_QUEQUE(Q,w);
}
w=Next_Adjmatrim_vex(G,v,w);
}
}
}
*/
void BFS(Adjmatrim *G,int v0)
{
QUEQUE Q=Create_QUEQUE();
printf("%c",G->vex[v0]);
visited[v0]=1;
input_QUEQUE(Q,v0);
while(!Empty(Q))
{
int v;
out_QUEQUE(Q,&v);
int w=First_Adjmatrim_VEX(G,v);
while(w!=-1)
{
if(visited[w]!=1)
{
printf("%c",G->vex[w]);
visited[w]=1;
input_QUEQUE(Q,w);
}
w=Next_Adjmatrim_vex(G,v,w);
}
}
}
void TraverseG_BFS(Adjmatrim *G) //深度优先遍历
{
int i;
for(i=0;i<MAXVEX;i++)
visited[i]=0;
for(i=0;i<G->vexnum;i++)
if(!visited[i])
BFS(G,i);
}
void out_QUEQUE(QUEQUE Q,int *w)
{
if(!Empty(Q))
{
*w=Q->vex[Q->rear];
Q->rear--;
}
}
void input_QUEQUE(QUEQUE Q,int w)
{
Q->rear++;
Q->vex[Q->rear]=w;
}
int Empty(QUEQUE Q)
{
if(Q->rear==-1)
return 1;
else
return 0;
}
QUEQUE Create_QUEQUE()
{
QUEQUE Q=(QUEQUE)malloc(sizeof(QUEQUE_1));
Q->front=Q->rear=-1;
return Q;
}
/*
5 7
ABCDE
AB
AE
BC
CD
DA
DB
EC
*/运行结果:
不输出领接矩阵

输出领接矩阵

版权声明:本文为weixin_44119517原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。