图的表示
邻接矩阵在边数相对点数较少时会浪费存储空间。使用数组和链表相结合的邻接表存储。
图的存储————邻接矩阵法
有向图中,第i个结点的出(入)度=第i行(列)的非零元素个数,第i个结点的度= 第i行和第i列的非零个数之和
无向图中,第i个结点的度 = 第i行(列)的非零元素个数,无向图的邻接矩阵是对称矩阵可压缩
对于n个顶点和e条边的图,时间复杂度是 O ( n + n 2 + e ) O(n+n^{2}+e) O(n+n2+e)
typedef char VertexType;
typedef int EdgeType;
/*邻接矩阵在边数相对点数较少时会浪费存储空间。使用数组和链表相结合的邻接表存储。*/
typedef struct
{
VertexType vexs[MAXVEX]; //顶点表
EdgeType arc[MAXVEX][MAXVEX]; //邻接矩阵
int numVertexes, numEdges; //图中当前的顶点数和边数
}MGraph;
/* 图的存储————邻接矩阵法存储带权图*/
void CreateMGraph(MGraph *G)
{
int i, j, k, w;
printf("输入顶点数和边数:\n");
scanf("%d,%d", &(G->numVertexes), &(G->numEdges));
for (i = 0; i < G->numVertexes; i++)
scanf(&G->vexs[i]); /*输入顶点,建立顶点表*/
for (i = 0; i < G->numVertexes; i++)
for (j = 0; j < G->numVertexes; j++)
G->arc[i][j] = INFINITY; /*邻接矩阵初始化*/
for (k = 0; k < G->numEdges; k++) /*读入numEdges条边,建立邻接矩阵*/
{
printf("输入边(vi,vj)的下标i,下标j,权重w: \n");
scanf("%d,%d,%d", &i, &j, &w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j]; /*无向网,矩阵对称*/
}
}
图的存储————邻接表法
//typedef char VertexType; //顶点类型
//typedef int EdgeType; //边上的权值类型
typedef struct EdgeNode /*边表结点*/
{
int adjvex; /*邻接点域,顶点对应的下标*/
EdgeType weight; /*存储权值,非网图可以不需要*/
struct EdgeNode *next; /*链域,指向下一个邻接点*/
}EdgeNode;
typedef struct VertexNode /*顶点表结点*/
{
VertexType data; //顶点域,存储顶点信息
EdgeNode *firstedge; /*边表头指针*/
}VertexNode, AdjList[MAXVEX];
//邻接表的数据结构
typedef struct
{
AdjList adjList;
int numVertexes, numEdges; //图中当前顶点数和边数
}GraphAdjList;
/*建立无向图的邻接表*/
void CreateALGraph(GraphAdjList *G)
{
int i, j, k; //i.j代表邻接的两个点,k表示点的数量
EdgeNode *e;
printf("输入顶点数和边数:\n");
scanf("%d,%d", &(G->numVertexes), &(G->numEdges));
for (i = 0; i < G->numVertexes; i++) //读入顶点信息,建立顶点表
{
scanf(&(G->adjList[i].data));
G->adjList[i].firstedge = NULL; //将边表置为空表
}
for (k = 0; k < G->numVertexes; k++) //建立边表
{
printf("输入边(vi,vj)的顶点序号:\n");
scanf("%d,%d", &i, &j); //输入边(vi,vj)的顶点序号
e = (EdgeNode *)malloc(sizeof(E