数据结构(五)---图:
①图的定义
图是由顶点集合(Vertex)及顶点间的关系集合组成的一种数据结构。
②图的操作
图的一些常用操作:创建图、销毁图、清空图、加入边、删除边、获取权、获取结点的度、获取图的结点数、获取图的边数。
③图的存储结构
1、邻接矩阵法:
基本思想:
用一维数组存储顶点 – 描述顶点相关的数据。
用二维数组存储边 – 描述顶点间的边。
用一维数组存储顶点 – 描述顶点相关的数据。
用二维数组存储边 – 描述顶点间的边。
无向图的邻接矩阵是对称的。
有向图的邻接矩阵可能是不对称的。
有向图的邻接矩阵可能是不对称的。
邻接矩阵法实现图结构:
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
typedef char VertexType; //顶点类型应由用户定义
typedef int EdgeType; //边上的权值类型应由用户定义
#define MAXVEX 100 //最大顶点数,应由用户定义
#define INFINITY 65535 //用65535来代表无穷大
#define DEBUG
typedef struct
{
VertexType vexs[MAXVEX]; //顶点表
EdgeType arc[MAXVEX][MAXVEX]; //邻接矩阵,可看作边
int numVertexes, numEdges; //图中当前的顶点数和边数
}Graph;
//定位
int locates(Graph *g, char ch)
{
int i = 0;
for(i = 0; i < g->numVertexes; i++)
{
if(g->vexs[i] == ch)
{
break;
}
}
if(i >= g->numVertexes)
{
return -1;
}
return i;
}
//建立一个无向网图的邻接矩阵表示
void CreateGraph(Graph *g)
{
int i, j, k, w;
printf("输入顶点数和边数:\n");
scanf("%d,%d", &(g->numVertexes), &(g->numEdges));
#ifdef DEBUG
printf("%d %d\n", g->numVertexes, g->numEdges);
#endif
for(i = 0; i < g->numVertexes; i++)
{
g->vexs[i] = getchar();
while(g->vexs[i] == '\n')
{
g->vexs[i] = getchar();
}
}
#ifdef DEBUG
for(i = 0; i < g->numVertexes; i++)
{
printf("%c ", g->vexs[i]);
}
printf("\n");
#endif
for(i = 0; i < g->numEdges; i++)
{
for(j = 0; j < g->numEdges; j++)
{