图的邻接矩阵表示及基本操作
#include
#define MAX_VERTEX_NUM 20//最多顶点个数
#define INFINITY 32768//表示极大值
#define ERROR -1
typedef enum{DG,DN,UDG,UDN
}GraphKind;
typedef char VertexData;
typedef char OtherInfo;
typedef struct ArcNode{
int adj;//权值为整形,对于无向图用1或0表示是否邻接;对于带权图,则为权值数字
OtherInfo info;
}ArcNode;
typedef struct{
VertexData vertex[MAX_VERTEX_NUM];//顶点向量
ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
int vexnum,arcnum;//图的顶点数和弧数
GraphKind kind;
}AdjMatrix;
//求顶点位置的定位函数
int LocateVertex(AdjMatrix *G,VertexData v)
{
int j=ERROR,k;
for(k=0;kvexnum;k++)
if(G->vertex[k]==v)
{
j=k;
break;
}
return(j);
}
//创建图(以有向图为例)
void CreateGraph(AdjMatrix *G)
{
int i,j,k,weight;
VertexData v1,v2;
printf("请输入图的顶点数和弧数(最大不超过20):");
scanf("%d %d",&G->vexnum,&G->arcnum);
//初始化邻接矩阵
for(i=0;ivexnum;i++)
for(j=0;jvexnum;j++)
G->arcs[i][j].adj=INFINITY;
fflush(stdin);
printf("请输入图的顶点(大写字母):");
for(i=0;ivexnum;i++)
{
scanf("%c",&G->vertex[i]);
//fflush(stdin);
}
fflush(stdin);
printf("请输入一条弧的两个顶点及权值(例如AB2):\n");
for(k=0;kvexnum;k++)
{
scanf("%c %c %d",&v1,&v2,&weight);
i=LocateVertex(G,v1);
j=LocateVertex(G,v2);
G->arcs[i][j].adj=weight;
G->arcs[j][i].adj=weight;
fflush(stdin);
}
}
//返回第i个顶点的值
VertexData GetVertex(AdjMatrix *G,int i)
{
if(G->vexnum==0)
return(ERROR);
if(i>G->vexnum)
return(ERROR);
return(G->vertex[i-1]);
}
//找顶点v的第一个邻接点
VertexData FirstAdjVertex(AdjMatrix *G,VertexData v)
{
if(G->vexnum==0||LocateVertex(G,v)==ERROR)
return(ERROR);
int i,j;
i=LocateVertex(G,v);
for(j=1;jvexnum;j++)
{
if(G->arcs[i][j].adj!=INFINITY)
return(G->vertex[i]);
}
return(ERROR);
}
//找顶点v关于顶点v的下一个邻接点
VertexData NextAdjVertex(AdjMatrix *G,VertexData v,VertexData w)
{
if(G->vexnum==0||LocateVertex(G,v)==ERROR)
return(ERROR);
int i,j,k;
i=LocateVertex(G,v);
j=LocateVertex(G,w);
for(k=j+1;kvexnum;k++)
{
if(G->arcs[i][k].adj!=INFINITY)
return(G->vertex[k]);
}
return(ERROR);
}
//在屏幕上打印邻接矩阵
void print(AdjMatrix *G)
{
int i,j;
for(i=0;ivexnum;i++)
for(j=0;jvexnum;j++)
{
printf("%10d",G->arcs[i][j].adj);
if((j+1)%G->vexnum==0)
printf("\n");
}
}
//访问标志数组
int visited[MAX_VERTEX_NUM]={0};
//深度优先遍历
void DeepthFirstSearch(AdjMatrix G,int v0)
{
printf("%c ",G.vertex[v0]);
visited[v0]=1;
int vj;
for(vj=0;vj
#include
#define MAX_VERTEX_NUM 20//最多顶点个数
#define ERROR -1
typedef char VertexData;
//边表节点类型定义
typedef struct ArcNode{
int adj;//该弧指向顶点的位置
struct ArcNode *nextarc;//指向下一条弧的指针
}ArcNode;
//表头节点类型定义
typedef struct VertexNode{
VertexData data;
ArcNode *firstarc;//指向该顶点第一条弧的指针;
int order;
}VertexNode;
typedef struct{
VertexNode vertex[MAX_VERTEX_NUM];
int vexnum,arcnum;
}AdjList;
int LocateVertex(AdjList *G,VertexData v)
{
int j=ERROR,k;
for(k=1;kvexnum;k++)
if(G->vertex[k].data==v)
{
j=G->vertex[k].order;
break;
}
return(j);
}
void CreateGraph(AdjList *G)
{
printf("请输入图的顶点数和弧数(最多不超过20):");
scanf("%d %d",&G->vexnum,&G->arcnum);
printf("请输入顶点:");
int i,j,k;
char v1,v2;
for(i=0;ivexnum;i++)
{
scanf("%c",&(G->vertex[i].data));
G->vertex[i].order=i+1;
}
printf("请输入一条弧的两个顶点(例如AB):\n");
for(k=0;kvexnum;k++)
{
scanf("%c %c",&v1,&v2);
ArcNode *p,*q;
p=(ArcNode*)malloc(sizeof(ArcNode));
q=(ArcNode*)malloc(sizeof(ArcNode));
p->nextarc=NULL;
q->nextarc=NULL;
i=LocateVertex(G,v1);
j=LocateVertex(G,v2);
G->vertex[i].firstarc=p;
G->vertex[j].firstarc=q;
fflush(stdin);
}
}
void print(AdjList *G)
{
int i,j;
for(i=0;ivexnum;i++)
{
printf("%c ",G->vertex[i].data);
ArcNode *p;
p=G->vertex[i].firstarc;
while(p!=NULL)
{
printf("%d ",p->adj);
p=p->nextarc;
}
}
}
void main()
{
AdjList G;
CreateGraph(&G);
print(&G);
}