1. /* 顶点类型应由用户定义 */
    2. typedef char VertexType;
    3. /* 边上的权值类型应由用户定义 */
    4. typedef int EdgeType;
    5. /* 最大顶点数,应由用户定义 */
    6. #define MAXVEX 100
    7. /* 用65535来代表∞ */infinitynˈfɪnəti]无穷大(的数)
    8. #define INFINITY 65535
    9. typedef struct
    10. {
    11. /* 顶点表 */
    12. VertexType vexs[MAXVEX];
    13. /* 邻接矩阵,可看作边表 */
    14. EdgeType arc[MAXVEX][MAXVEX];
    15. /* 图中当前的顶点数和边数 */
    16. int numVertexes, numEdges;
    17. } MGraph;
    1. /* 建立无向网图的邻接矩阵表示 */
    2. void CreateMGraph(MGraph *G)
    3. {
    4. int i, j, k, w;
    5. printf("输入顶点数和边数:\n");
    6. /* 输入顶点数和边数 */
    7. scanf("%d,%d", &(G->numVertexes), &(G->numEdges));
    8. /* 读入顶点信息,建立顶点表 */
    9. for (i = 0; i < G->numVertexes; i++)
    10. scanf(&G->vexs[i]);
    11. for (i = 0; i < G->numVertexes; i++)
    12. for (j = 0; j <G->numVertexes; j++)
    13. /* 邻接矩阵初始化 */
    14. G->arc[i][j] = INFINITY;
    15. /* 读入numEdges条边,建立邻接矩阵 */
    16. for (k = 0; k < G->numEdges; k++)
    17. {
    18. printf("输入边(vi,vj)上的下标i,下标j和权w:\n");
    19. /* 输入边(vi,vj)上的权w */
    20. scanf("%d,%d,%d", &i, &j, &w);
    21. G->arc[i][j] = w;
    22. /* 因为是无向图,矩阵对称 */
    23. G->arc[j][i] = G->arc[i][j];
    24. }
    25. }
    26. 从代码中也可以得到,n个顶点和e条边的无向网图的创建,时间复杂度为O(n+n2+e),
    27. 其中对邻接矩阵G.arc的初始化耗费了O(n2)的时间。
    1. /* 顶点类型应由用户定义 */
    2. typedef char VertexType;
    3. /* 边上的权值类型应由用户定义 */
    4. typedef int EdgeType;
    5. /* 边表结点 */
    6. typedef struct EdgeNode
    7. {
    8. /* 邻接点域,存储该顶点对应的下标 */
    9. EdgeType adjvex;
    10. /* 用于存储权值,对于非网图可以不需要 */
    11. EdgeType weight;
    12. /* 链域,指向下一个邻接点  */
    13. struct EdgeNode *next;
    14. } EdgeNode;
    15. /* 顶点表结点 */
    16. typedef struct VertexNode
    17. {
    18. /* 顶点域,存储顶点信息 */
    19. VertexType data;
    20. /* 边表头指针 */
    21. EdgeNode *firstedge;
    22. } VertexNode, AdjList[MAXVEX];
    23. //结构
    24. typedef struct
    25. {
    26. AdjList adjList;//<=>VertexNode[] adjList;顶点表结点(结构体)类型的数组
    27. /* 图中当前顶点数和边数 */
    28. int numVertexes, numEdges;
    29. } GraphAdjList;
    1. /* 建立图的邻接表结构 */
    2. void CreateALGraph(GraphAdjList *G)
    3. {
    4. int i, j, k;
    5. EdgeNode *e;
    6. printf("输入顶点数和边数:\n");
    7. /* 输入顶点数和边数 */
    8. scanf("%d,%d", &G->numVertexes, &G->numEdges);
    9. /* 读入顶点信息,建立顶点表 */
    10. for (i = 0; i < G->numVertexes; i++)
    11. {
    12. /* 输入顶点信息 */
    13. scanf(&(G->adjList[i].data));
    14. /* 将边表置为空表 */
    15. G->adjList[i].firstedge = NULL;
    16. }
    17. /* 建立边表 */
    18. for (k = 0; k < G->numEdges; k++)
    19. {
    20. printf("输入边(vi,vj)上的顶点序号:\n");
    21. /* 输入边(vi,vj)上的顶点序号 */
    22. scanf("%d,%d", &i, &j);
    23. /* 向内存申请空间, */
    24. /* 生成边表结点 */
    25. e = (EdgeNode *)malloc(sizeof(EdgeNode));
    26. /* 邻接序号为j */
    27. e->adjvex = j;
    28. /* 将e指针指向当前顶点指向的结点 *///注意:G->adjList[i].firstedge在上面被置空NULL
    29. e->next = G->adjList[i].firstedge;
    30. /* 将当前顶点的指针指向e */
    31. G->adjList[i].firstedge = e;
    32. /* 向内存申请空间, */
    33. /* 生成边表结点 */
    34. e = (EdgeNode *)malloc(sizeof(EdgeNode));
    35. /* 邻接序号为i */
    36. e->adjvex = i;
    37. /* 将e指针指向当前顶点指向的结点 */
    38. e->next = G->adjList[j].firstedge;
    39. /* 将当前顶点的指针指向e */
    40. G->adjList[j].firstedge = e;
    41. }
    42. }
    43. 本算法的时间复杂度,对于n个顶点e条边来说,很容易得出是O(n+e)。