图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; } }