6.1 图的存储结构
6.1.1 邻接矩阵
#include<stdio.h>
#define MAXSIZE 20//最多顶点个数
#define INFINITY 32768//表示极大值
typedef int Elemtype;
typedef int OtherInfo;
typedef enum{DG,DN,UDG,UDN
}GraphKind;//有向图 有向网 无向图 无向网
typedef char VertexData;//顶点数据类型
typedef struct ArcNode{
Elemtype adj;//无权图用0,1表示是否相邻,对有权图表示权值类型
OtherInfo info;
}ArcNode;
typedef struct{
VertexData vertex[MAXSIZE];//顶点向量
ArcNode arcs[MAXSIZE][MAXSIZE];//邻接矩阵
int vexnum,arcnum;//顶点数和弧数
GraphKind kind;//图的种类标志
}AdjMatrix;
int LocateVertex(AdjMatrix *G,VertexData v)//求顶点位置函数
{
int j=-1,k;
for(k=0;k<G->vexnum;k++)
if(G->vertex[k]==v)
{
j=k;
break;
}
return(j);
}
int CreateDN(AdjMatrix *G)//创建一个有向网
{
int i,j,k=0,weight;
VertexData v1,v2;
printf("请输入图的顶点数和弧数:");
scanf("%d,%d",&G->vexnum,&G->arcnum);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arcs[i][j].adj=INFINITY;
printf("请输入图的顶点:");
char ch=getchar();
for(i=0;i<G->vexnum;i++)
scanf("%c",&G->vertex[i]);
printf("请输入一条弧的两个顶点和权值:");
while(k<G->arcnum)
{
ch=getchar();
scanf("%c,%c,%d",&v1,&v2,&weight);
i=LocateVertex(G,v1);
j=LocateVertex(G,v2);
G->arcs[i][j].adj=weight;
k++;
}
return(1);
}
6.1.2 邻接表
#define MAXSIZE 20//最多顶点个数
typedef int OtherInfo;
typedef enum{DG,DN,UDG,UDN
}GraphKind;//有向图 有向网 无向图 无向网
typedef char VertexData;//顶点数据类型
typedef struct ArcNode{
int adjvex;//该弧指向顶点的位置
struct ArcNode * nextarc;//指向下一条弧的指针
OtherInfo info;//与该弧相关的信息
}ArcNode;
typedef struct VertexNode{
VertexData data;//顶点数据
ArcNode * firstarc;//指向该顶点第一条弧的指针
}VertexNode;
typedef struct{
VertexNode vertex[MAXSIZE];
int vexnum,arcnum;//图的顶点数和弧数
GraphKind kind;//图的种类标志
}AdjList;
6.1.3 十字链表
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20//最多顶点个数
typedef enum{DG,DN,UDG,UDN
}GraphKind;//有向图 有向网 无向图 无向网
typedef char VertexData;//顶点数据类型
typedef struct ArcNode{
int tailvex,headvex;//弧头/尾顶点在图中的位置
struct ArcNode * hlink,*tlink;//于此弧弧头/尾相同的下一条弧
}ArcNode;
typedef struct VertexNode{
VertexData data;//顶点数据
ArcNode * firstin,*firstout;//指向以该顶点作为弧头/尾的第一个弧顶点
}VertexNode;
typedef struct{
VertexNode vertex[MAXSIZE];
int vexnum,arcnum;
GraphKind kind;
}OrthList;
int LocateVertex(OrthList *g,VertexData v)//求顶点位置函数
{
int j=-1,k;
for(k=0;k<g->vexnum;k++)
if(g->vertex[k].data==v)
{
j=k;
break;
}
return(j);
}
void CrtOrthList(OrthList *g)//创建图的十字链表
{
int n,e,i,j,k;
char vh,vt;
ArcNode* p;
printf("请输入图的顶点个数和弧的个数:");
scanf("%d,%d",&n,&e);
g->vexnum=n;
g->arcnum=e;
printf("请输入顶点:");
char ch=getchar();
for(i=0;i<n;i++)
{
scanf("%c",&(g->vertex[i].data));
printf("data=%c\n",g->vertex[i].data);
g->vertex[i].firstin=NULL;
g->vertex[i].firstout=NULL;
}
printf("请输入弧尾和弧头:");
for(k=0;k<e;k++)
{
ch=getchar();
scanf("%c,%c",&vt,&vh);
i=LocateVertex(g,vt);
j=LocateVertex(g,vh);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->tailvex=i;
p->headvex=j;
p->tlink=g->vertex[i].firstout;
g->vertex[i].firstout=p;
p->hlink=g->vertex[j].firstin;
g->vertex[j].firstin=p;
}
}
6.2 图的遍历
6.2.1 深度优先搜索
6.2.2 广度优先搜索
6.3 图的应用