100.png

    1. /*
    2. 输出顶点vi到顶点vj的所有简单路径,图用邻接表存储
    3. 分析:
    4. 这里明说了输出路径,所以肯定存在简单路径。为了输出路径,我们还需要额外添加一个path数组,
    5. 用来存储vi到vj的路径数据,方便我们之后打印输出。我们这里仍然采用深度优先遍历,广度优先遍历不适合。
    6. */
    7. #define _CRT_SECURE_NO_WARNINGS
    8. #define MAXSIZE 100
    9. #include <stdio.h>
    10. #include <stdlib.h>
    11. typedef struct EdgeNode {//边表结点
    12. int index;//该边所指向的顶点的位置
    13. int weight;//权值
    14. EdgeNode *next;//下一个邻接边
    15. }EdgeNode;
    16. typedef struct VertexNode {//顶点表节点
    17. char info;//顶点信息
    18. EdgeNode *firstEdge;//指向第一条依附该顶点的边的指针
    19. }VertexNode, Adjlist[MAXSIZE];
    20. typedef struct {
    21. Adjlist adjlist;//顶点数组
    22. int numE, numV;//边数、顶点数
    23. }ALGraph;
    24. void print(ALGraph *G, int *path, int vi,int d) {
    25. for (int i = 0; i <= d; i++)
    26. printf("%c ", G->adjlist[path[i]].info);
    27. printf("\n");
    28. }
    29. void findRoute(ALGraph *G, int vi, int vj, int *path, int *visited, int d) {
    30. EdgeNode *p;
    31. d++;
    32. path[d] = vi;
    33. visited[vi] = 1;
    34. if (vi == vj) {
    35. print(G, path, vi,d);
    36. }
    37. for (p = G->adjlist[vi].firstEdge; p;p=p->next) {
    38. if (!visited[p->index]) {
    39. findRoute(G,p->index,vj,path,visited,d);
    40. }
    41. }
    42. visited[vi] = 0;//重新置位可访问
    43. }
    44. int main() {
    45. void createGraphInFile(ALGraph *G);
    46. ALGraph *G = (ALGraph *)malloc(sizeof(ALGraph *));
    47. void dispGraph(ALGraph *);
    48. createGraphInFile(G);//创建图
    49. int vi, vj;
    50. printf("请输入vi,vj\n");
    51. printf("vi= ");
    52. scanf("%d", &vi);
    53. printf("vj= ");
    54. scanf("%d", &vj);
    55. while (vi > G->numV || vj > G->numV) {
    56. printf("输入有误,不存在该顶点,请重新输入!");
    57. printf("vi= ");
    58. scanf("%d", &vi);
    59. printf("vj= ");
    60. scanf("%d", &vj);
    61. }
    62. int *visited = (int *)malloc(sizeof(int)*G->numV);
    63. int *path = (int *)malloc(sizeof(int)*G->numV);
    64. for (int i = 0; i < G->numV; i++) {
    65. visited[i] = 0;//初始化
    66. path[i] = -1;//初始化
    67. }
    68. dispGraph(G);
    69. findRoute(G, vi - 1, vj - 1, path, visited, -1);
    70. return 0;
    71. }