《数据布局(C语言版)第二版》第六章-图(6.4 图的存储布局——6.4.2 毗邻 ...

打印 上一主题 下一主题

主题 537|帖子 537|积分 1611

6.4.2 毗邻表

接纳毗邻表表现法创建无向图

  1. //算法6.2 采用邻接表表示法创建无向图
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define MVNum 100
  5. typedef int OtherInfo;   //假设在边结点中的数据域存储边的权值,且边的权值类型为整型
  6. typedef char VerTexType;  //假设顶点的数据类型为字符型
  7. typedef struct ArcNode
  8. {
  9.         int adjvex;
  10.         struct ArcNode* nextarc;
  11.         OtherInfo info;
  12. }ArcNode;  //边结点
  13. typedef struct VNode
  14. {
  15.         VerTexType data;
  16.         ArcNode* firstarc;
  17. }VNode,AdjList[MVNum];  //表头结点
  18. typedef struct
  19. {
  20.         AdjList vertices;  //存储所有顶点
  21.         int vexnum;  //顶点总数
  22.         int arcnum;  //总边数
  23. }ALGraph;  //图的信息
  24. void CreateUDG(ALGraph& G);
  25. int LocateVex(ALGraph& G, VerTexType v);
  26. void printALGraph(ALGraph &G);
  27. int main()
  28. {
  29.         ALGraph G = { {'\0',NULL}, 0,0};
  30.         CreateUDG(G);
  31.         printALGraph(G);
  32.         return 0;
  33. }
  34. void CreateUDG(ALGraph& G)
  35. {
  36.         int i = 0;
  37.         int k = 0;
  38.         VerTexType v1 = 0;
  39.         VerTexType v2 = 0;
  40.         int j = 0;
  41.         ArcNode *p1 = NULL;
  42.         ArcNode *p2 = NULL;
  43.         printf("请输入无向图的总顶点数:");
  44.         scanf_s(" %d", &G.vexnum);
  45.         printf("请输入无向图的总边数:");
  46.         scanf_s(" %d", &G.arcnum);
  47.         for (i = 0; i < G.vexnum; ++i)
  48.         {
  49.                 printf("请输入第%d个顶点的值:", i + 1);
  50.                 scanf_s(" %c", &(G.vertices[i].data));
  51.                 G.vertices[i].firstarc = NULL;   //初始化
  52.         }
  53.         for (k = 0; k < G.arcnum; k++)
  54.         {
  55.                 printf("请输入第%d条边依附的两个顶点(用空格间隔,输入结束后按回车): ", k + 1);
  56.                 scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));
  57.                 i = LocateVex(G, v1);
  58.                 j = LocateVex(G, v2);
  59.                 p1 = (ArcNode*)malloc(sizeof(ArcNode));
  60.                 p1->adjvex = j;
  61.                 p1->nextarc = G.vertices[i].firstarc;
  62.                 G.vertices[i].firstarc = p1;  //将新结点*p1插入顶点Vi的边表头部
  63.                 p2 = (ArcNode*)malloc(sizeof(ArcNode));
  64.                 p2->adjvex = i;
  65.                 p2->nextarc = G.vertices[j].firstarc;
  66.                 G.vertices[j].firstarc = p2;  //将与*p1对称的新的边结点*p2插入顶点Vj的边表头部
  67.         }
  68. }
  69. //在G的顶点表vexs中获取字符v的下标(数组G.vexs的下标从0开始)
  70. int LocateVex(ALGraph& G, VerTexType v)
  71. {
  72.         int i = 0;
  73.         for (i = 0; i < G.vexnum && (G.vertices[i].data != v); ++i)
  74.         {
  75.                 ;
  76.         }
  77.         return i;
  78. }
  79. //打印邻接表
  80. void printALGraph(ALGraph& G)
  81. {
  82.         int i = 0;
  83.         ArcNode* pMove = NULL;
  84.         for (i = 0; i < G.vexnum; i++)
  85.         {
  86.                 printf("\n第%d个顶点为:%c", i + 1, G.vertices[i].data);
  87.                 pMove = G.vertices[i].firstarc;
  88.                 if (pMove)
  89.                 {
  90.                         printf("\n与第%d个顶点相邻接的每个顶点在图中的位置(下标值)为:", i + 1);
  91.                         while (pMove)
  92.                         {
  93.                                 printf("%d ", pMove->adjvex);
  94.                                 pMove = pMove->nextarc;
  95.                         }
  96.                 }
  97.                 else
  98.                 {
  99.                         printf("\n没有与第%d个顶点相邻接的顶点。", i + 1);
  100.                 }
  101.         }
  102. }
复制代码



   一个图的毗邻矩阵表现是唯一的,但其毗邻表表现不唯一。
    不改变图中每个顶点的命名方式,也不改变图的边(每条边的起尽头),
仅改变边的输入序次时,图的毗邻表中每个顶点背面边表中的结点排序方式会发生变化。
由于图中的顶点没变,边也没变,每个顶点及其边表中的内容不会发生变化。
  



接纳毗邻表表现法创建有向图

  1. //采用邻接表表示法创建有向图
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define MVNum 100
  5. typedef int OtherInfo;   //假设在边结点中的数据域存储边的权值,且边的权值类型为整型
  6. typedef char VerTexType;  //假设顶点的数据类型为字符型
  7. typedef struct ArcNode
  8. {
  9.         int adjvex;
  10.         struct ArcNode* nextarc;
  11.         OtherInfo info;
  12. }ArcNode;  //边结点
  13. typedef struct VNode
  14. {
  15.         VerTexType data;
  16.         ArcNode* firstarc;
  17. }VNode, AdjList[MVNum];  //表头结点
  18. typedef struct
  19. {
  20.         AdjList vertices;  //存储所有顶点
  21.         int vexnum;  //顶点总数
  22.         int arcnum;  //总边数
  23. }ALGraph;  //图的信息
  24. void CreateDG(ALGraph& G);
  25. int LocateVex(ALGraph& G, VerTexType v);
  26. void printALGraph(ALGraph& G);
  27. int main()
  28. {
  29.         ALGraph G = { {'\0',NULL}, 0,0 };
  30.         CreateDG(G);
  31.         printALGraph(G);
  32.         return 0;
  33. }
  34. //采用邻接表表示法创建有向图
  35. void CreateDG(ALGraph& G)
  36. {
  37.         int i = 0;
  38.         int k = 0;
  39.         VerTexType v1 = 0;
  40.         VerTexType v2 = 0;
  41.         int j = 0;
  42.         ArcNode* p1 = NULL;
  43.         ArcNode* p2 = NULL;
  44.         printf("请输入有向图的总顶点数:");
  45.         scanf_s(" %d", &G.vexnum);
  46.         printf("请输入有向图的总边数:");
  47.         scanf_s(" %d", &G.arcnum);
  48.         for (i = 0; i < G.vexnum; ++i)
  49.         {
  50.                 printf("请输入第%d个顶点的值:", i + 1);
  51.                 scanf_s(" %c", &(G.vertices[i].data));
  52.                 G.vertices[i].firstarc = NULL;   //初始化
  53.         }
  54.         for (k = 0; k < G.arcnum; k++)
  55.         {
  56.                 printf("请输入第%d条边依附的两个顶点(用空格间隔,输入结束后按回车): ", k + 1);
  57.                 scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));
  58.                 i = LocateVex(G, v1);
  59.                 j = LocateVex(G, v2);
  60.                 p1 = (ArcNode*)malloc(sizeof(ArcNode));
  61.                 p1->adjvex = j;
  62.                 p1->nextarc = G.vertices[i].firstarc;
  63.                 G.vertices[i].firstarc = p1;  //将新结点*p1插入顶点Vi的边表头部
  64.         }
  65. }
  66. //在G的顶点表vexs中获取字符v的下标(数组G.vexs的下标从0开始)
  67. int LocateVex(ALGraph& G, VerTexType v)
  68. {
  69.         int i = 0;
  70.         for (i = 0; i < G.vexnum && (G.vertices[i].data != v); ++i)
  71.         {
  72.                 ;
  73.         }
  74.         return i;
  75. }
  76. //打印邻接表
  77. void printALGraph(ALGraph& G)
  78. {
  79.         int i = 0;
  80.         ArcNode* pMove = NULL;
  81.         for (i = 0; i < G.vexnum; i++)
  82.         {
  83.                 printf("\n第%d个顶点为:%c", i + 1, G.vertices[i].data);
  84.                 pMove = G.vertices[i].firstarc;
  85.                 if (pMove)
  86.                 {
  87.                         printf("\n将第%d个顶点作为出度,与其相邻接的每个顶点在图中的位置(下标值)为:", i + 1);
  88.                         while (pMove)
  89.                         {
  90.                                 printf("%d ", pMove->adjvex);
  91.                                 pMove = pMove->nextarc;
  92.                         }
  93.                 }
  94.                 else
  95.                 {
  96.                         printf("\n将第%d个顶点作为出度,没有与其相邻接的顶点。", i + 1);
  97.                 }
  98.         }
  99. }
复制代码



创建有向图的逆毗邻表

  1. //创建有向图的逆邻接表
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define MVNum 100
  5. typedef int OtherInfo;   //假设在边结点中的数据域存储边的权值,且边的权值类型为整型
  6. typedef char VerTexType;  //假设顶点的数据类型为字符型
  7. typedef struct ArcNode
  8. {
  9.         int adjvex;
  10.         struct ArcNode* nextarc;
  11.         OtherInfo info;
  12. }ArcNode;  //边结点
  13. typedef struct VNode
  14. {
  15.         VerTexType data;
  16.         ArcNode* firstarc;
  17. }VNode, AdjList[MVNum];  //表头结点
  18. typedef struct
  19. {
  20.         AdjList vertices;  //存储所有顶点
  21.         int vexnum;  //顶点总数
  22.         int arcnum;  //总边数
  23. }ALGraph;  //图的信息
  24. void CreateDG(ALGraph& G);
  25. int LocateVex(ALGraph& G, VerTexType v);
  26. void printALGraph(ALGraph& G);
  27. int main()
  28. {
  29.         ALGraph G = { {'\0',NULL}, 0,0 };
  30.         CreateDG(G);
  31.         printALGraph(G);
  32.         return 0;
  33. }
  34. //创建有向图的逆邻接表
  35. void CreateDG(ALGraph& G)
  36. {
  37.         int i = 0;
  38.         int k = 0;
  39.         VerTexType v1 = 0;
  40.         VerTexType v2 = 0;
  41.         int j = 0;
  42.         ArcNode* p1 = NULL;
  43.         ArcNode* p2 = NULL;
  44.         printf("请输入有向图的总顶点数:");
  45.         scanf_s(" %d", &G.vexnum);
  46.         printf("请输入有向图的总边数:");
  47.         scanf_s(" %d", &G.arcnum);
  48.         for (i = 0; i < G.vexnum; ++i)
  49.         {
  50.                 printf("请输入第%d个顶点的值:", i + 1);
  51.                 scanf_s(" %c", &(G.vertices[i].data));
  52.                 G.vertices[i].firstarc = NULL;   //初始化
  53.         }
  54.         for (k = 0; k < G.arcnum; k++)
  55.         {
  56.                 printf("请输入第%d条边依附的两个顶点(用空格间隔,输入结束后按回车): ", k + 1);
  57.                 scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));
  58.                 i = LocateVex(G, v1);
  59.                 j = LocateVex(G, v2);
  60.                 p1 = (ArcNode*)malloc(sizeof(ArcNode));
  61.                 p1->adjvex = i;
  62.                 p1->nextarc = G.vertices[j].firstarc;
  63.                 G.vertices[j].firstarc = p1;  //将新结点*p1插入顶点Vj的边表头部
  64.         }
  65. }
  66. //在G的顶点表vexs中获取字符v的下标(数组G.vexs的下标从0开始)
  67. int LocateVex(ALGraph& G, VerTexType v)
  68. {
  69.         int i = 0;
  70.         for (i = 0; i < G.vexnum && (G.vertices[i].data != v); ++i)
  71.         {
  72.                 ;
  73.         }
  74.         return i;
  75. }
  76. //打印逆邻接表
  77. void printALGraph(ALGraph& G)
  78. {
  79.         int i = 0;
  80.         ArcNode* pMove = NULL;
  81.         for (i = 0; i < G.vexnum; i++)
  82.         {
  83.                 printf("\n第%d个顶点为:%c", i + 1, G.vertices[i].data);
  84.                 pMove = G.vertices[i].firstarc;
  85.                 if (pMove)
  86.                 {
  87.                         printf("\n将第%d个顶点作为入度,与其相邻接的每个顶点在图中的位置(下标值)为:", i + 1);
  88.                         while (pMove)
  89.                         {
  90.                                 printf("%d ", pMove->adjvex);
  91.                                 pMove = pMove->nextarc;
  92.                         }
  93.                 }
  94.                 else
  95.                 {
  96.                         printf("\n将第%d个顶点作为入度,没有与其相邻接的顶点。", i + 1);
  97.                 }
  98.         }
  99. }
复制代码


接纳毗邻表表现法创建无向网

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MVNum 100
  4. typedef int OtherInfo;   //假设在边结点中的数据域存储边的权值,且边的权值类型为整型
  5. typedef char VerTexType;  //假设顶点的数据类型为字符型
  6. typedef struct ArcNode
  7. {
  8.         int adjvex;
  9.         struct ArcNode* nextarc;
  10.         OtherInfo info;
  11. }ArcNode;  //边结点
  12. typedef struct VNode
  13. {
  14.         VerTexType data;
  15.         ArcNode* firstarc;
  16. }VNode, AdjList[MVNum];  //表头结点
  17. typedef struct
  18. {
  19.         AdjList vertices;  //存储所有顶点
  20.         int vexnum;  //顶点总数
  21.         int arcnum;  //总边数
  22. }ALGraph;  //图的信息
  23. void CreateUDN(ALGraph& G);
  24. int LocateVex(ALGraph& G, VerTexType v);
  25. void printALGraph(ALGraph& G);
  26. int main()
  27. {
  28.         ALGraph G = { {'\0',NULL}, 0,0 };
  29.         CreateUDN(G);
  30.         printALGraph(G);
  31.         return 0;
  32. }
  33. //采用邻接表表示法创建无向网
  34. void CreateUDN(ALGraph& G)
  35. {
  36.         int i = 0;
  37.         int k = 0;
  38.         VerTexType v1 = 0;
  39.         VerTexType v2 = 0;
  40.         int j = 0;
  41.         ArcNode* p1 = NULL;
  42.         ArcNode* p2 = NULL;
  43.         int w = 0;
  44.         printf("请输入无向网的总顶点数:");
  45.         scanf_s(" %d", &G.vexnum);
  46.         printf("请输入无向网的总边数:");
  47.         scanf_s(" %d", &G.arcnum);
  48.         for (i = 0; i < G.vexnum; ++i)
  49.         {
  50.                 printf("请输入第%d个顶点的值:", i + 1);
  51.                 scanf_s(" %c", &(G.vertices[i].data));
  52.                 G.vertices[i].firstarc = NULL;   //初始化
  53.         }
  54.         for (k = 0; k < G.arcnum; k++)
  55.         {
  56.                 printf("请输入第%d条边依附的两个顶点(用空格间隔,输入结束后按回车): ", k + 1);
  57.                 scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));               
  58.                 printf("请输入第%d条边的权值 : ", k + 1);
  59.                 scanf_s(" %d", &w, sizeof(OtherInfo));
  60.                 i = LocateVex(G, v1);
  61.                 j = LocateVex(G, v2);
  62.                 p1 = (ArcNode*)malloc(sizeof(ArcNode));
  63.                 p1->adjvex = j;
  64.                 p1->info = w;
  65.                 p1->nextarc = G.vertices[i].firstarc;
  66.                 G.vertices[i].firstarc = p1;  //将新结点*p1插入顶点Vi的边表头部
  67.                 p2 = (ArcNode*)malloc(sizeof(ArcNode));
  68.                 p2->adjvex = i;
  69.                 p1->info = w;
  70.                 p2->nextarc = G.vertices[j].firstarc;
  71.                 G.vertices[j].firstarc = p2;  //将与*p1对称的新的边结点*p2插入顶点Vj的边表头部
  72.         }
  73. }
  74. //在G的顶点表vexs中获取字符v的下标(数组G.vexs的下标从0开始)
  75. int LocateVex(ALGraph& G, VerTexType v)
  76. {
  77.         int i = 0;
  78.         for (i = 0; i < G.vexnum && (G.vertices[i].data != v); ++i)
  79.         {
  80.                 ;
  81.         }
  82.         return i;
  83. }
  84. //打印邻接表
  85. void printALGraph(ALGraph& G)
  86. {
  87.         int i = 0;
  88.         ArcNode* pMove = NULL;
  89.         for (i = 0; i < G.vexnum; i++)
  90.         {
  91.                 printf("\n第%d个顶点为:%c", i + 1, G.vertices[i].data);
  92.                 pMove = G.vertices[i].firstarc;
  93.                 if (pMove)
  94.                 {
  95.                         printf("\n与第%d个顶点相邻接的每个顶点在网中的位置(下标值)为:", i + 1);
  96.                         while (pMove)
  97.                         {
  98.                                 printf("%d ", pMove->adjvex);
  99.                                 pMove = pMove->nextarc;
  100.                         }
  101.                 }
  102.                 else
  103.                 {
  104.                         printf("\n没有与第%d个顶点相邻接的顶点。", i + 1);
  105.                 }
  106.         }
  107. }
复制代码


接纳毗邻表表现法创建有向网

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MVNum 100
  4. typedef int OtherInfo;   //假设在边结点中的数据域存储边的权值,且边的权值类型为整型
  5. typedef char VerTexType;  //假设顶点的数据类型为字符型
  6. typedef struct ArcNode
  7. {
  8.         int adjvex;
  9.         struct ArcNode* nextarc;
  10.         OtherInfo info;
  11. }ArcNode;  //边结点
  12. typedef struct VNode
  13. {
  14.         VerTexType data;
  15.         ArcNode* firstarc;
  16. }VNode, AdjList[MVNum];  //表头结点
  17. typedef struct
  18. {
  19.         AdjList vertices;  //存储所有顶点
  20.         int vexnum;  //顶点总数
  21.         int arcnum;  //总边数
  22. }ALGraph;  //图的信息
  23. void CreateDN(ALGraph& G);
  24. int LocateVex(ALGraph& G, VerTexType v);
  25. void printALGraph(ALGraph& G);
  26. int main()
  27. {
  28.         ALGraph G = { {'\0',NULL}, 0,0 };
  29.         CreateDN(G);
  30.         printALGraph(G);
  31.         return 0;
  32. }
  33. //采用邻接表表示法创建有向网
  34. void CreateDN(ALGraph& G)
  35. {
  36.         int i = 0;
  37.         int k = 0;
  38.         VerTexType v1 = 0;
  39.         VerTexType v2 = 0;
  40.         int j = 0;
  41.         ArcNode* p1 = NULL;
  42.         ArcNode* p2 = NULL;
  43.         int w = 0;
  44.         printf("请输入有向网的总顶点数:");
  45.         scanf_s(" %d", &G.vexnum);
  46.         printf("请输入有向网的总边数:");
  47.         scanf_s(" %d", &G.arcnum);
  48.         for (i = 0; i < G.vexnum; ++i)
  49.         {
  50.                 printf("请输入第%d个顶点的值:", i + 1);
  51.                 scanf_s(" %c", &(G.vertices[i].data));
  52.                 G.vertices[i].firstarc = NULL;   //初始化
  53.         }
  54.         for (k = 0; k < G.arcnum; k++)
  55.         {
  56.                 printf("请输入第%d条边依附的两个顶点(用空格间隔,输入结束后按回车): ", k + 1);
  57.                 scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));               
  58.                 printf("请输入第%d条边的权值 : ", k + 1);
  59.                 scanf_s(" %d", &w, sizeof(OtherInfo));
  60.                 i = LocateVex(G, v1);
  61.                 j = LocateVex(G, v2);
  62.                 p1 = (ArcNode*)malloc(sizeof(ArcNode));
  63.                 p1->adjvex = j;
  64.                 p1->info = w;
  65.                 p1->nextarc = G.vertices[i].firstarc;
  66.                 G.vertices[i].firstarc = p1;  //将新结点*p1插入顶点Vi的边表头部
  67.         }
  68. }
  69. //在G的顶点表vexs中获取字符v的下标(数组G.vexs的下标从0开始)
  70. int LocateVex(ALGraph& G, VerTexType v)
  71. {
  72.         int i = 0;
  73.         for (i = 0; i < G.vexnum && (G.vertices[i].data != v); ++i)
  74.         {
  75.                 ;
  76.         }
  77.         return i;
  78. }
  79. //打印邻接表
  80. void printALGraph(ALGraph& G)
  81. {
  82.         int i = 0;
  83.         ArcNode* pMove = NULL;
  84.         for (i = 0; i < G.vexnum; i++)
  85.         {
  86.                 printf("\n第%d个顶点为:%c", i + 1, G.vertices[i].data);
  87.                 pMove = G.vertices[i].firstarc;
  88.                 if (pMove)
  89.                 {
  90.                         printf("\n将第%d个顶点作为出度,与其相邻接的每个顶点在网中的位置(下标值)为:", i + 1);
  91.                         while (pMove)
  92.                         {
  93.                                 printf("%d ", pMove->adjvex);
  94.                                 pMove = pMove->nextarc;
  95.                         }
  96.                 }
  97.                 else
  98.                 {
  99.                         printf("\n将第%d个顶点作为出度,没有与第%d个顶点相邻接的顶点。", i + 1);
  100.                 }
  101.         }
  102. }
复制代码


创建有向网的逆毗邻表

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MVNum 100
  4. typedef int OtherInfo;   //假设在边结点中的数据域存储边的权值,且边的权值类型为整型
  5. typedef char VerTexType;  //假设顶点的数据类型为字符型
  6. typedef struct ArcNode
  7. {
  8.         int adjvex;
  9.         struct ArcNode* nextarc;
  10.         OtherInfo info;
  11. }ArcNode;  //边结点
  12. typedef struct VNode
  13. {
  14.         VerTexType data;
  15.         ArcNode* firstarc;
  16. }VNode, AdjList[MVNum];  //表头结点
  17. typedef struct
  18. {
  19.         AdjList vertices;  //存储所有顶点
  20.         int vexnum;  //顶点总数
  21.         int arcnum;  //总边数
  22. }ALGraph;  //图的信息
  23. void CreateDN(ALGraph& G);
  24. int LocateVex(ALGraph& G, VerTexType v);
  25. void printALGraph(ALGraph& G);
  26. int main()
  27. {
  28.         ALGraph G = { {'\0',NULL}, 0,0 };
  29.         CreateDN(G);
  30.         printALGraph(G);
  31.         return 0;
  32. }
  33. //创建有向网的逆邻接表
  34. void CreateDN(ALGraph& G)
  35. {
  36.         int i = 0;
  37.         int k = 0;
  38.         VerTexType v1 = 0;
  39.         VerTexType v2 = 0;
  40.         int j = 0;
  41.         ArcNode* p1 = NULL;
  42.         ArcNode* p2 = NULL;
  43.         int w = 0;
  44.         printf("请输入有向网的总顶点数:");
  45.         scanf_s(" %d", &G.vexnum);
  46.         printf("请输入有向网的总边数:");
  47.         scanf_s(" %d", &G.arcnum);
  48.         for (i = 0; i < G.vexnum; ++i)
  49.         {
  50.                 printf("请输入第%d个顶点的值:", i + 1);
  51.                 scanf_s(" %c", &(G.vertices[i].data));
  52.                 G.vertices[i].firstarc = NULL;   //初始化
  53.         }
  54.         for (k = 0; k < G.arcnum; k++)
  55.         {
  56.                 printf("请输入第%d条边依附的两个顶点(用空格间隔,输入结束后按回车): ", k + 1);
  57.                 scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));
  58.                 printf("请输入第%d条边的权值 : ", k + 1);
  59.                 scanf_s(" %d", &w, sizeof(OtherInfo));
  60.                 i = LocateVex(G, v1);
  61.                 j = LocateVex(G, v2);
  62.                 p1 = (ArcNode*)malloc(sizeof(ArcNode));
  63.                 p1->adjvex = i;
  64.                 p1->info = w;
  65.                 p1->nextarc = G.vertices[j].firstarc;
  66.                 G.vertices[j].firstarc = p1;  //将新结点*p1插入顶点Vj的边表头部
  67.         }
  68. }
  69. //在G的顶点表vexs中获取字符v的下标(数组G.vexs的下标从0开始)
  70. int LocateVex(ALGraph& G, VerTexType v)
  71. {
  72.         int i = 0;
  73.         for (i = 0; i < G.vexnum && (G.vertices[i].data != v); ++i)
  74.         {
  75.                 ;
  76.         }
  77.         return i;
  78. }
  79. //打印逆邻接表
  80. void printALGraph(ALGraph& G)
  81. {
  82.         int i = 0;
  83.         ArcNode* pMove = NULL;
  84.         for (i = 0; i < G.vexnum; i++)
  85.         {
  86.                 printf("\n第%d个顶点为:%c", i + 1, G.vertices[i].data);
  87.                 pMove = G.vertices[i].firstarc;
  88.                 if (pMove)
  89.                 {
  90.                         printf("\n将第%d个顶点作为入度,与其相邻接的每个顶点在网中的位置(下标值)为:", i + 1);
  91.                         while (pMove)
  92.                         {
  93.                                 printf("%d ", pMove->adjvex);
  94.                                 pMove = pMove->nextarc;
  95.                         }
  96.                 }
  97.                 else
  98.                 {
  99.                         printf("\n将第%d个顶点作为入度,没有与第%d个顶点相邻接的顶点。", i + 1);
  100.                 }
  101.         }
  102. }
复制代码

6.4.3 十字链表

接纳十字链表表现法创建有向图

  1. //采用十字链表表示法创建有向图
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define MAX_VERTEX_NUM  20
  5. typedef int InfoType;   //假设在边结点中的数据域存储边的权值,且边的权值类型为整型
  6. typedef char VerTexType;  //假设顶点的数据类型为字符型
  7. typedef struct ArcBox
  8. {
  9.         int tailvext;
  10.         int headvex;
  11.         struct ArcBox* hlink;
  12.         struct ArcBox* tlink;
  13.         InfoType *info;
  14. }ArcBox;  
  15. typedef struct VexNode
  16. {
  17.         VerTexType data;
  18.         ArcBox *firstin;
  19.         ArcBox *firstout;
  20. }VexNode;
  21. typedef struct
  22. {
  23.         VexNode xlist[MAX_VERTEX_NUM];  //表头向量
  24.         int vexnum;  //顶点总数
  25.         int arcnum;  //总边数
  26. }OLGraph;  //图的信息
  27. void CreateOLGraph(OLGraph& G);
  28. int LocateVex(OLGraph& G, VerTexType v);
  29. void printOLGraph(OLGraph& G);
  30. int main()
  31. {
  32.         OLGraph G = { {'\0',NULL,NULL}, 0,0 };
  33.         CreateOLGraph(G);
  34.         printOLGraph(G);
  35.         return 0;
  36. }
  37. //采用十字链表表示法创建有向图
  38. void CreateOLGraph(OLGraph& G)
  39. {
  40.         int i = 0;
  41.         int j = 0;
  42.         int k = 0;
  43.         VerTexType v1 = 0;
  44.         VerTexType v2 = 0;
  45.         ArcBox* p1 = NULL;
  46.         printf("请输入有向图的总顶点数:");
  47.         scanf_s(" %d", &G.vexnum);
  48.         printf("请输入有向图的总边数:");
  49.         scanf_s(" %d", &G.arcnum);
  50.         for (i = 0; i < G.vexnum; ++i)
  51.         {
  52.                 printf("请输入第%d个顶点的值:", i + 1);
  53.                 scanf_s(" %c", &(G.xlist[i].data));
  54.                 G.xlist[i].firstin = NULL;
  55.                 G.xlist[i].firstout = NULL;//初始化
  56.         }
  57.         for (k = 0; k < G.arcnum; k++)
  58.         {
  59.                 printf("请输入第%d条弧依附的两个顶点(用空格间隔,输入结束后按回车): ", k + 1);
  60.                 scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));
  61.                 //起点v1是弧尾,终点v2是弧头
  62.                 //弧<v1,v2>是v1的出度,是v2的入度
  63.                 i = LocateVex(G, v1);
  64.                 j = LocateVex(G, v2);
  65.                 //起点v1是弧尾,下标值为i;终点v2是弧头,下标值为j
  66.                 //弧<v1,v2>是第i+1个顶点的出度firstout,是第j+1个顶点的入度firstin
  67.                 p1 = (ArcBox*)malloc(sizeof(ArcBox));
  68.                 p1->tailvext = i;  //起点v1是弧尾,下标值为i
  69.                 p1->headvex = j;   //终点v2是弧头,下标值为j
  70.                 //p1弧结点中的链域tlink指向与其弧尾tailvext相同的下一条弧(即指向第i+1个顶点v1的下一个出度firstout)
  71.                 p1->tlink = G.xlist[i].firstout;  //p1指向的弧<v1,v2>是第i+1个顶点v1的出度firstout
  72.                 G.xlist[i].firstout = p1;   //前插法将p1插入到第i+1个顶点v1的出度单链表中
  73.                 //p1弧结点中的链域hlink指向与其弧头headvex相同的下一条弧(即指向第j+1个顶点v2的下一个入度firstin)
  74.                 p1->hlink = G.xlist[j].firstin;   //p1指向的弧<v1,v2>是第j+1个顶点v2的入度firstin
  75.                 G.xlist[j].firstin = p1;  //前插法将p1插入到第j+1个顶点v2的入度单链表中
  76.         }
  77. }
  78. //在G的顶点表xlist中获取字符v的下标(数组G.xlist的下标从0开始)
  79. int LocateVex(OLGraph& G, VerTexType v)
  80. {
  81.         int i = 0;
  82.         for (i = 0; i < G.vexnum && (G.xlist[i].data != v); ++i)
  83.         {
  84.                 ;
  85.         }
  86.         return i;
  87. }
  88. //打印十字链表
  89. void printOLGraph(OLGraph& G)
  90. {
  91.         int i = 0;
  92.         ArcBox* pMoveIn = NULL;
  93.         ArcBox* pMoveOut = NULL;
  94.         for (i = 0; i < G.vexnum; i++)
  95.         {
  96.                 printf("\n第%d个顶点为:%c", i + 1, G.xlist[i].data);
  97.                 pMoveOut = G.xlist[i].firstout;
  98.                 if (pMoveOut)
  99.                 {
  100.                         printf("\n将第%d个顶点作为出度,与其相邻接的每个顶点在图中的位置(下标值)为:", i + 1);
  101.                         while (pMoveOut)
  102.                         {
  103.                                 printf("%d ", pMoveOut->headvex);
  104.                                 pMoveOut = pMoveOut->tlink;
  105.                         }
  106.                 }
  107.                 else
  108.                 {
  109.                         printf("\n将第%d个顶点作为出度,没有与其相邻接的顶点。", i + 1);
  110.                 }
  111.                 pMoveIn = G.xlist[i].firstin;
  112.                 if (pMoveIn)
  113.                 {
  114.                         printf("\n将第%d个顶点作为入度,与其相邻接的每个顶点在图中的位置(下标值)为:", i + 1);
  115.                         while (pMoveIn)
  116.                         {
  117.                                 printf("%d ", pMoveIn->tailvext);
  118.                                 pMoveIn = pMoveIn->hlink;
  119.                         }
  120.                 }
  121.                 else
  122.                 {
  123.                         printf("\n将第%d个顶点作为入度,没有与其相邻接的顶点。", i + 1);
  124.                 }
  125.         }
  126. }
复制代码


   该有向图的毗邻矩阵,其中各行、各列中不为0的元素,与其十字链表每个顶点的出度、入度效果有对应关系。

  接纳十字链表表现法创建有向网

   输入并读取权值,赋值到 弧结点 ArcBox 布局中的 info 成员即可。
  1. //采用十字链表表示法创建有向网
  2. void CreateOLGraph(OLGraph& G)
  3. {
  4.         int i = 0;
  5.         int j = 0;
  6.         int k = 0;
  7.         VerTexType v1 = 0;
  8.         VerTexType v2 = 0;
  9.         ArcBox* p1 = NULL;
  10.         int* w = 0;
  11.         printf("请输入有向网的总顶点数:");
  12.         scanf_s(" %d", &G.vexnum);
  13.         printf("请输入有向网的总边数:");
  14.         scanf_s(" %d", &G.arcnum);
  15.         for (i = 0; i < G.vexnum; ++i)
  16.         {
  17.                 printf("请输入第%d个顶点的值:", i + 1);
  18.                 scanf_s(" %c", &(G.xlist[i].data));
  19.                 G.xlist[i].firstin = NULL;
  20.                 G.xlist[i].firstout = NULL;//初始化
  21.         }
  22.         for (k = 0; k < G.arcnum; k++)
  23.         {
  24.                 printf("请输入第%d条弧依附的两个顶点(用空格间隔,输入结束后按回车): ", k + 1);
  25.                 scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));
  26.                 printf("请输入第%d条边的权值 : ", k + 1);
  27.                 scanf_s(" %d", w, sizeof(InfoType));  //在ArcBox中,info由指向int的指针定义
  28.                 i = LocateVex(G, v1);
  29.                 j = LocateVex(G, v2);
  30.                 p1 = (ArcBox*)malloc(sizeof(ArcBox));
  31.                 p1->tailvext = i;
  32.                 p1->headvex = j;  
  33.                 p1->info = w;  //赋值到弧结点p1中的info成员
  34.                 p1->tlink = G.xlist[i].firstout;  
  35.                 G.xlist[i].firstout = p1;   
  36.                 p1->hlink = G.xlist[j].firstin;   
  37.                 G.xlist[j].firstin = p1;  
  38.         }
  39. }
复制代码
6.4.4 毗邻多重表

接纳毗邻多重表表现法创建无向图

  1. //采用邻接多重表表示法创建无向图
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define MAX_VERTEX_NUM  20
  5. typedef enum {unvisited,visited} VisitIf;
  6. typedef int InfoType;   //假设在边结点中的数据域存储边的权值,且边的权值类型为整型
  7. typedef char VerTexType;  //假设顶点的数据类型为字符型
  8. typedef struct EBox
  9. {
  10.         VisitIf mark;
  11.         int ivex;
  12.         int jvex;
  13.         struct EBox* ilink;
  14.         struct EBox* jlink;
  15.         InfoType *info;
  16. }EBox;  
  17. typedef struct VexBox
  18. {
  19.         VerTexType data;
  20.         EBox* firstedge;
  21. }VexBox;
  22. typedef struct
  23. {
  24.         VexBox adjmulist[MAX_VERTEX_NUM];  //表头向量
  25.         int vexnum;  //顶点总数
  26.         int edgenum;  //总边数
  27. }AMLGraph;  //图的信息
  28. void CreateAMLGraph(AMLGraph& G);
  29. int LocateVex(AMLGraph& G, VerTexType v);
  30. void printAMLGraph(AMLGraph& G);
  31. int main()
  32. {
  33.         AMLGraph G = { {'\0',NULL,NULL}, 0,0 };
  34.         CreateAMLGraph(G);
  35.         printAMLGraph(G);
  36.         return 0;
  37. }
  38. //采用邻接多重表表示法创建无向图
  39. void CreateAMLGraph(AMLGraph& G)
  40. {
  41.         int i = 0;
  42.         int j = 0;
  43.         int k = 0;
  44.         VerTexType v1 = 0;
  45.         VerTexType v2 = 0;
  46.         EBox* p1 = NULL;
  47.         printf("请输入无向图的总顶点数:");
  48.         scanf_s(" %d", &G.vexnum);
  49.         printf("请输入无向图的总边数:");
  50.         scanf_s(" %d", &G.edgenum);
  51.         for (i = 0; i < G.vexnum; ++i)
  52.         {
  53.                 printf("请输入第%d个顶点的值:", i + 1);
  54.                 scanf_s(" %c", &(G.adjmulist[i].data));
  55.                 G.adjmulist[i].firstedge = NULL;  //初始化
  56.         }
  57.         for (k = 0; k < G.edgenum; k++)
  58.         {
  59.                 printf("请输入第%d条弧依附的两个顶点(用空格间隔,输入结束后按回车): ", k + 1);
  60.                 scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));
  61.                
  62.                 i = LocateVex(G, v1);
  63.                 j = LocateVex(G, v2);
  64.                 p1 = (EBox*)malloc(sizeof(EBox));
  65.                 p1->ivex = i;
  66.                 p1->jvex = j;  
  67.                 p1->ilink = G.adjmulist[i].firstedge;
  68.                 G.adjmulist[i].firstedge = p1;
  69.                 p1->jlink = G.adjmulist[j].firstedge;
  70.                 G.adjmulist[j].firstedge = p1;
  71.         }
  72. }
  73. //在G的顶点表adjmulist中获取字符v的下标(数组G.xlist的下标从0开始)
  74. int LocateVex(AMLGraph& G, VerTexType v)
  75. {
  76.         int i = 0;
  77.         for (i = 0; i < G.vexnum && (G.adjmulist[i].data != v); ++i)
  78.         {
  79.                 ;
  80.         }
  81.         return i;
  82. }
  83. //打印邻接多重表
  84. void printAMLGraph(AMLGraph& G)
  85. {
  86.         int i = 0;
  87.         EBox* pMove = NULL;
  88.         for (i = 0; i < G.vexnum; i++)
  89.         {
  90.                 printf("\n第%d个顶点为:%c", i + 1, G.adjmulist[i].data);
  91.                 pMove = G.adjmulist[i].firstedge;
  92.                 if (pMove)
  93.                 {
  94.                         printf("\n与第%d个顶点相邻接的每个顶点在图中的位置(下标值)为:", i + 1);
  95.                         while (pMove)
  96.                         {
  97.                                 if (pMove->ivex == i)
  98.                                 {
  99.                                         printf("%d ", pMove->jvex);
  100.                                         pMove = pMove->ilink;
  101.                                 }
  102.                                 else if (pMove->jvex == i)
  103.                                 {
  104.                                         printf("%d ", pMove->ivex);
  105.                                         pMove = pMove->jlink;
  106.                                 }
  107.                         }
  108.                 }
  109.                 else
  110.                 {
  111.                         printf("\n没有与第%d个顶点相邻接的顶点。", i + 1);
  112.                 }       
  113.         }
  114. }
复制代码



接纳毗邻多重表表现法创建无向网

   输入并读取权值,赋值到 边结点 EBox 布局中的 info 成员即可。
  1. //采用邻接多重表表示法创建无向网
  2. void CreateAMLGraph(AMLGraph& G)
  3. {
  4.         int i = 0;
  5.         int j = 0;
  6.         int k = 0;
  7.         VerTexType v1 = 0;
  8.         VerTexType v2 = 0;
  9.         EBox* p1 = NULL;
  10.         int* w = 0;
  11.         printf("请输入无向网的总顶点数:");
  12.         scanf_s(" %d", &G.vexnum);
  13.         printf("请输入无向网的总边数:");
  14.         scanf_s(" %d", &G.edgenum);
  15.         for (i = 0; i < G.vexnum; ++i)
  16.         {
  17.                 printf("请输入第%d个顶点的值:", i + 1);
  18.                 scanf_s(" %c", &(G.adjmulist[i].data));
  19.                 G.adjmulist[i].firstedge = NULL;  //初始化
  20.         }
  21.         for (k = 0; k < G.edgenum; k++)
  22.         {
  23.                 printf("请输入第%d条弧依附的两个顶点(用空格间隔,输入结束后按回车): ", k + 1);
  24.                 scanf_s(" %c %c", &v1, sizeof(VerTexType), &v2, sizeof(VerTexType));
  25.                 printf("请输入第%d条边的权值 : ", k + 1);
  26.                 scanf_s(" %d", w, sizeof(InfoType));  //在EBox中,info由指向int的指针定义
  27.                 i = LocateVex(G, v1);
  28.                 j = LocateVex(G, v2);
  29.                 p1 = (EBox*)malloc(sizeof(EBox));
  30.                 p1->ivex = i;
  31.                 p1->jvex = j;  
  32.                 p1->info = w;   //赋值到边结点p1中的info成员
  33.                 p1->ilink = G.adjmulist[i].firstedge;
  34.                 G.adjmulist[i].firstedge = p1;
  35.                 p1->jlink = G.adjmulist[j].firstedge;
  36.                 G.adjmulist[j].firstedge = p1;
  37.         }
  38. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表