邻接矩阵
#include <stdio.h>
#include <stdlib.h>
#include <data.h>
#define MAX_VERTEX_NUM 20//最大顶点个数
#define VRType int //顶点间关系
#define InfoType char//储存弧或额外信息的指针变量
#define VertexType int//顶点数据类型
typedef enum{DG,DN,UDG,UDN}GraphKind;//枚举图的四种类型
typedef struct//邻接矩阵
{
VRType adj;//对于无权图为0或1
//对于有权图为权值
InfoType *info;//弧或边含有的额外信息指针
}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,VertexType v)
{
int i=0;
for(;i<G->vexnum;i++)
{
if(G->vexs[i]==v)
{
break;
}
}
if(i>=G->vexnum)
{
printf("未找到顶点位置\n");
return -1;
}
return i;
}
//构造有向图
void CreateDG(MGraph *G)
{
scanf("%d%d",&(G->vexnum),&(G->arcnum));//输入顶点数和边数
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;
G->arcs[i][j].info=NULL;
}
}//初始化邻接矩阵,全部不可通,指针为NULL
for(int k=0;k<G->arcnum;k++)
{
int v1,v2;
scanf("%d%d",v1,v2);
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
if(i==-1||j==-1)
{
printf("此顶点不存在");
return ;
}
G->arcs[i][j].adj=1;
}
}
//构造无向图
void CreateDN(MGraph *G)
{
scanf("%d%d",&(G->vexnum),&(G->arcnum));
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;
G->arcs[i][j].info=NULL;
}
}
for(int k=0;k<G->arcnum;k++)
{
int v1,v2;
scanf("%d%d",&v1,&v2);
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
if(i==-1||j==-1)
{
printf("此顶点不存在\n");
return ;
}
G->arcs[i][j].adj=1;
G->arcs[j][i].adj=1;//与有向图不同,无向图关于对角线对称
}
}
//构造有向网
void CreateUDG(MGraph *G)
{
scanf("%d%d",&(G->vexnum),&(G->arcnum));
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=INT_MAX;//有权图不连通时为无穷大
G->arcs[i][j].info=NULL;
}
}
for(int k=0;k<G->arcnum;k++)
{
int v1,v2,w;
scanf("%d%d%d",&v1,&v2,&w);
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
if(i==-1||j==-1)
{
printf("此顶点不存在\n");
return;
}
G->arcs[i][j].adj=w;
}
}
//构造无向网
void CreateUDN(MGraph *G)
{
scanf("%d%d",&(G->vexnum),&(G->arcnum));
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=INT_MAX;
G->arcs[i][j].info=NULL;
}
}
for(int k=0;k<G->arcnum;k++)
{
int v1,v2,w;
scanf("%d%d%d",&v1,&v2,&w);
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
if(i==-1||j==-1)
{
printf("此顶点不存在\n");
return;
}
G->arcs[i][j].adj=w;
G->arcs[j][i].adj=w;
}
}
//创建图
void CreateGraph(MGraph *G)
{
scanf("%d",&(G->kind));
switch(G->kind)
{
case DG:
return CreateDG(G);
break;
case DN:
return CreateDN(G);
break;
case UDG:
return CreateUDG(G);
break;
case UDN:
return CreateUDN(G);
break;
default:
break;
}
}
//遍历图的权值
void PrintGraph(MGraph G)
{
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
{
printf("%d",G.arcs[i][j].adj);
}
printf("\n");
}
}
int main()
{
MGraph G;
CreateGraph(&G);
PrintGraph(G);
return 0;
}
邻接表
#include <stdio.h>
#include <stdlib.h>
#include <data.h>
#define MAX_VERTEX_NUM 20//最大顶点个数
#define VertexType int //顶点数据类型
#define InfoType int //边包含的信息类型
typedef struct ArcNode//边的节点结构
{
int adjvex;//邻接点在数组中的下标位置
struct ArcNode *nextarc;//指向下一个边界点
InfoType *info;//信息域
}ArcNode;
typedef struct VNode
{
VertexType data;//顶点数据域
ArcNode *firstarc;//指向邻接点的指针
}VNode,AdjList[MAX_VERTEX_NUM];//储存各链表头结点的数组
typedef struct {
AdjList vertices;//链表头结点数组
int vexnum,arcnum;//记录顶点数和边数
int kind;//记录图的种类
}ALGraph;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。