/* 顶点类型应由用户定义 */
typedef char VertexType;
/* 边上的权值类型应由用户定义 */
typedef int EdgeType;
/* 最大顶点数,应由用户定义 */
#define MAXVEX 100
/* 用65535来代表∞ */infinity[ɪnˈfɪnəti]无穷大(的数)
#define INFINITY 65535
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;
/* 读入numEdges条边,建立邻接矩阵 */
for (k = 0; k < G->numEdges; k++)
{
printf("输入边(vi,vj)上的下标i,下标j和权w:\n");
/* 输入边(vi,vj)上的权w */
scanf("%d,%d,%d", &i, &j, &w);
G->arc[i][j] = w;
/* 因为是无向图,矩阵对称 */
G->arc[j][i] = G->arc[i][j];
}
}
从代码中也可以得到,n个顶点和e条边的无向网图的创建,时间复杂度为O(n+n2+e),
其中对邻接矩阵G.arc的初始化耗费了O(n2)的时间。
/* 顶点类型应由用户定义 */
typedef char VertexType;
/* 边上的权值类型应由用户定义 */
typedef int EdgeType;
/* 边表结点 */
typedef struct EdgeNode
{
/* 邻接点域,存储该顶点对应的下标 */
EdgeType adjvex;
/* 用于存储权值,对于非网图可以不需要 */
EdgeType weight;
/* 链域,指向下一个邻接点 */
struct EdgeNode *next;
} EdgeNode;
/* 顶点表结点 */
typedef struct VertexNode
{
/* 顶点域,存储顶点信息 */
VertexType data;
/* 边表头指针 */
EdgeNode *firstedge;
} VertexNode, AdjList[MAXVEX];
//结构
typedef struct
{
AdjList adjList;//<=>VertexNode[] adjList;顶点表结点(结构体)类型的数组
/* 图中当前顶点数和边数 */
int numVertexes, numEdges;
} GraphAdjList;
/* 建立图的邻接表结构 */
void CreateALGraph(GraphAdjList *G)
{
int 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->numEdges; k++)
{
printf("输入边(vi,vj)上的顶点序号:\n");
/* 输入边(vi,vj)上的顶点序号 */
scanf("%d,%d", &i, &j);
/* 向内存申请空间, */
/* 生成边表结点 */
e = (EdgeNode *)malloc(sizeof(EdgeNode));
/* 邻接序号为j */
e->adjvex = j;
/* 将e指针指向当前顶点指向的结点 *///注意:G->adjList[i].firstedge在上面被置空NULL
e->next = G->adjList[i].firstedge;
/* 将当前顶点的指针指向e */
G->adjList[i].firstedge = e;
/* 向内存申请空间, */
/* 生成边表结点 */
e = (EdgeNode *)malloc(sizeof(EdgeNode));
/* 邻接序号为i */
e->adjvex = i;
/* 将e指针指向当前顶点指向的结点 */
e->next = G->adjList[j].firstedge;
/* 将当前顶点的指针指向e */
G->adjList[j].firstedge = e;
}
}
本算法的时间复杂度,对于n个顶点e条边来说,很容易得出是O(n+e)。