转载自:http://blog.csdn.net/akof1314/article/details/4387701
@akof1314
图G由两个集合V和E组成,记为:
G=(V,E)
其中:
V是顶点的有穷非空集合,
E是V中顶点偶对(称为边)的有穷集。
通常,也将图G的顶点集和边集分别记为V(G)和E(G)。E(G)可以是空集。若E(G)为空,则图G只有顶点而没有边。
图有两种存储结构:邻接矩阵和邻接表
邻接矩阵: ① 用邻接矩阵表示顶点间的相邻关系
② 用一个顺序表来存储顶点信息
存储结构形式如下
#define MaxVertexNum 100
typedef char VertexType;
typedef int EdgeType;
typedef struct
{
VertexType vexs[MaxVertexNum]; //顶点表
EdgeType edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看做边表
int n,e; //图中当前的顶点数和边数
}MGragh;
建立邻接矩阵及相关例子如下:
#define MAXLEN 10
typedef struct
{
char vexs[MAXLEN];
int edges[MAXLEN][MAXLEN];
int n,e;
}MGraph;
//建立一个图的邻接矩阵存储的算法如下:
void CreateMGraph(MGraph *G)
{
int i,j,k;
char ch1,ch2;
printf("请输入顶点数和边数(输入格式为:顶点数,边数):/n");
scanf("%d,%d",&(G->n),&(G->e));
printf("请输入顶点信息(顶点号<CR>)每个顶点以回车作为结束:/n");
for(i=0;i<G->n;i++)
{
getchar();scanf("%c",&(G->vexs[i]));
}
for(i=0;i<G->n;i++)
for(j=0;j<G->n;j++)
G->edges[i][j]=0;
printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):/n");
for(k=0;k<G->e;k++)
{
getchar();
printf("请输入第%d条边的顶点序号:",k+1);
scanf("%c,%c",&ch1,&ch2);
for(i=0;ch1!=G->vexs[i];i++);
for(j=0;ch2!=G->vexs[j];j++);
G->edges[i][j]=1;
}
}
邻接表:类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List)。
结点结构包括:顶点表结点和边表结点
存储形式如下:
#define MaxVertexNum 100
typedef char VertexType;
typedef int EdgeType;
typedef struct node //边表结点
{
int adjvex; //邻接点域
struct node *next; //域链
//若是要表示边上的权,则应增加一个数据域
}EdgeNode;
typedef struct vnode //顶点边结点
{
VertexType vertex; //顶点域
EdgeNode *firstedge;//边表头指针
}VertexNode;
typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型
typedef struct
{
AdjList adjlist; //邻接表
int n,e; //图中当前顶点数和边数
}ALGraph; //对于简单的应用,无须定义此类型,可直接使用AdjList类型
建立邻接表及相关例子:
#define MAXLEN 10 // 最大顶点数为10
typedef struct node{ // 边表结点
int adjvex; // 邻接点域
struct node * next; // 指向下一个邻接点的指针域
//若要表示边上信息,则应增加一个数据域info
}EdgeNode;
typedef struct vnode{ // 顶点表结点
VertexType vertex; // 顶点域
EdgeNode * firstedge; // 边表头指针
}VertexNode;
typedef VertexNode AdjList[MAXLEN]; // AdjList是邻接表类型
typedef struct{
AdjList adjlist; // 接表
int n,e; // 顶点数和边数
}ALGraph; // ALGraph是以邻接表方式存储的图类型
//建立一个有向图的邻接表存储的算法如下:
void CreateGraphAL (ALGraph *G)
{
int i,j,k;
EdgeNode * s;
printf("请输入顶点数和边数(输入格式为:顶点数,边数):/n");
scanf("%d,%d",&(G->n),&(G->e)); // 读入顶点数和边数
printf("请输入顶点信息(输入格式为:顶点号<CR>)每个顶点以回车作为结束:/n");
for (i=0;i<G->n;i++) // 立有n个顶点的顶点表
{
scanf("/n%c",&(G->adjlist[i].vertex)); // 读入顶点信息
G->adjlist[i].firstedge=NULL; // 点的边表头指针设为空
}
printf("请输入边的信息(输入格式为:i,j):/n");
for (k=0;k<G->e;k++) // 建立边表
{
scanf("/n%d,%d",&i,&j); // 读入边<Vi,Vj>的顶点对应序号
s=new EdgeNode; // 生成新边表结点s
s->adjvex=j; // 邻接点序号为j
s->next=G->adjlist[i].firstedge; // 将新边表结点s插入到顶点Vi的边表头部
G->adjlist[i].firstedge=s;
}
}