在本题函数约束下,如何补全所给函数判断无向图的连通性与连通分量的输出?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ElemType char
#define ERROR -1
#define OK 1
#define TRUE 1
#define FALSE 0
#define MaxVerNum 100 

//邻接表的数据结构
typedef struct Node {
    int adjvex;  //邻接点下标
    struct Node *next;  //指向下一个邻接点
} EdgeNode, *ENode;

typedef struct VNode {
    ElemType data;  //顶点域
    ENode firstedge;  //边表头指针
} dataNode;

typedef dataNode AdjList[MaxVerNum];

typedef struct {
    AdjList adjlist;
    int n, e;
    int vexnum, arcnum;  //顶点数、边弧数
} AlGraph;

int visited[MaxVerNum];

int menu_select();    //菜单驱动程序
void Create(AlGraph *G);
int DFS_count(AlGraph *G,int j);
void DFSTraverse(AlGraph *G,int j);

int main() {
    int v = 0;
    int j = 0;
    AlGraph *G = (AlGraph *) malloc(sizeof(AlGraph));

    for (;;) {
        switch (menu_select()) {
        case 1:
            printf("邻接表存储无向图的建立\n");     //建立树的函数调用  
            Create(G);
            break;
        case 2:
            printf("判断无向图是否连通\n");
            j=DFS_count(G,0);
            if(j==1) {
            printf("无向图G是连通图\n");
            }else {
            printf("无向图G不是连通图\n");
            DFSTraverse(G,v);
            }
            break;
        case 0:
            printf("再见!\n");                //退出系统
            return 0;
        } // switch语句结束 
    } // for循环结束 
} // main()函数结束

//菜单驱动程序
int menu_select() {
    int sn;
    printf("判断无向图的连通性问题\n");        //显示菜单
    printf("==================================\n");
    printf("1.邻接表存储无向图的建立\n");
    printf("2.判断无向图是否连通,输出连通变量\n");
    printf("0.退出程序\n");
    printf("==================================\n");
    printf("请选择0--2:");

    for (;;) {
        scanf("%d", &sn);
        getchar();
        if (sn < 0 || sn > 2)
            printf("输入选择错误,请重新选择 0--2");
        else
            break;
    }
    return sn;
}

// 空格
void vBlank() {
    printf(" ");
}

// 数据展示
void PVisit(ElemType data) {
    printf("%c ", data);
}
/*
  以图的邻接表表示法为存储结构建立无向图
 */
void Create(AlGraph *G) {
    int i, j, k;
    EdgeNode *s, *r;
    printf("请依次输入无向图顶点个数和边的个数(用空格隔开)\n");
    scanf("%d %d", &(G->vexnum), &(G->arcnum));
    getchar();
    
    printf("请输入各顶点信息(用空格隔开)\n");
    for (i = 0; i < G->vexnum; i++) {
        scanf(" %c", &(G->adjlist[i].data));
        getchar();
        G->adjlist[i].firstedge = NULL;
    }
    
    printf("请输入各边(Vi,Vj)的顶点下标(用空格隔开)\n");
    for (k = 0; k < G->arcnum; k++) {
        scanf("%d %d", &i, &j);
        s = (EdgeNode *) malloc(sizeof(EdgeNode));
        s->adjvex = j;
        s->next = G->adjlist[i].firstedge;
        G->adjlist[i].firstedge = s;
        r = (EdgeNode *) malloc(sizeof(EdgeNode));
        r->adjvex = i;
        r->next = G->adjlist[j].firstedge;
        G->adjlist[j].firstedge = r;
    }
}

/*  
    TODO: 深度遍历无向图
    功能:使用递归方法,从下标i开始深度遍历无向图,遍历过的顶点将对应visited[i]从FALSE变成TRUE
          并调用上面提供的PVisit(ElemType data)输出遍历过的顶点信息。   
    参数:AlGraph *G是需要操作的图,int i是开始遍历的点的下标
    返回值:无。
*/
void DFS(AlGraph *G, int i) {

}

void DFS_noprint(AlGraph *G, int i) {
    EdgeNode *p;
    visited[i] = TRUE;
    p=G->adjlist[i].firstedge;
    while(p) {
        if (visited[p->adjvex] == FALSE)
            DFS_noprint(G,p->adjvex);    
        p = p->next;
    }
}

/*  
    TODO: 判断无向图G是否连通
    功能:将visited[]数组元素全部置为FALSE,使用DFS_noprint对图G进行遍历,
          统计DFS_noprint方法被调用的次数(递归中使用的不算),并返回统计结果。
    参数:AlGraph *G 是需要操作的图,int j是用来统计DFS_noprint被调用次数,初始值为0
    返回值:DFS_noprint被调用次数
*/
int DFS_count(AlGraph *G,int j) {

}

/*  
    TODO: 输出G的连通分量
    功能:重置visited[]数组的状态,都改成FALSE,然后使用DFS循环遍历图
          输出连通分量前,printf("第%d个连通变量:", ++j),j为一个变量,初始值0
          每输出完一个连通分量,使用printf("\n")进行换行
          
    参数:AlGraph *G是需要操作的图,int i是顶点下标
    返回值:无。
    举例:第1个连通变量:1 4 5 2 3
          第2个连通变量:6
*/
void DFSTraverse(AlGraph *G,int i) {

}





img

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。

C++:
G和i都是采用的传值方式,一般就是把实际的内容压栈。
T,按照C++的说法是,引用,也就是定义了实参的一个别名。在DFSTree内的操作,如同对实参进行操作。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define ElemType char
#define ERROR -1
#define OK 1
#define TRUE 1
#define FALSE 0
#define MaxVerNum 100 
 
//邻接表的数据结构
typedef struct Node {
    int adjvex;  //邻接点下标
    struct Node *next;  //指向下一个邻接点
} EdgeNode, *ENode;
 
typedef struct VNode {
    ElemType data;  //顶点域
    ENode firstedge;  //边表头指针
} dataNode;
 
typedef dataNode AdjList[MaxVerNum];
 
typedef struct {
    AdjList adjlist;
    int n, e;
    int vexnum, arcnum;  //顶点数、边弧数
} AlGraph;
 
int visited[MaxVerNum];
 
int menu_select();    //菜单驱动程序
void Create(AlGraph *G);
int DFS_count(AlGraph *G,int j);
void DFSTraverse(AlGraph *G,int j);
 
int main() {
    int v = 0;
    int j = 0;
    AlGraph *G = (AlGraph *) malloc(sizeof(AlGraph));
 
    for (;;) {
        switch (menu_select()) {
        case 1:
            printf("邻接表存储无向图的建立\n");     //建立树的函数调用  
            Create(G);
            break;
        case 2:
            printf("判断无向图是否连通\n");
            j=DFS_count(G,0);
            if(j==1) {
            printf("无向图G是连通图\n");
            }else {
            printf("无向图G不是连通图\n");
            DFSTraverse(G,v);
            }
            break;
        case 0:
            printf("再见!\n");                //退出系统
            return 0;
        } // switch语句结束 
    } // for循环结束 
} // main()函数结束
 
//菜单驱动程序
int menu_select() {
    int sn;
    printf("判断无向图的连通性问题\n");        //显示菜单
    printf("==================================\n");
    printf("1.邻接表存储无向图的建立\n");
    printf("2.判断无向图是否连通,输出连通变量\n");
    printf("0.退出程序\n");
    printf("==================================\n");
    printf("请选择0--2:");
 
    for (;;) {
        scanf("%d", &sn);
        getchar();
        if (sn < 0 || sn > 2)
            printf("输入选择错误,请重新选择 0--2");
        else
            break;
    }
    return sn;
}
 
// 空格
void vBlank() {
    printf(" ");
}
 
// 数据展示
void PVisit(ElemType data) {
    printf("%c ", data);
}
/*
  以图的邻接表表示法为存储结构建立无向图
 */
void Create(AlGraph *G) {
    int i, j, k;
    EdgeNode *s, *r;
    printf("请依次输入无向图顶点个数和边的个数(用空格隔开)\n");
    scanf("%d %d", &(G->vexnum), &(G->arcnum));
    getchar();
    
    printf("请输入各顶点信息(用空格隔开)\n");
    for (i = 0; i < G->vexnum; i++) {
        scanf(" %c", &(G->adjlist[i].data));
        getchar();
        G->adjlist[i].firstedge = NULL;
    }
    
    printf("请输入各边(Vi,Vj)的顶点下标(用空格隔开)\n");
    for (k = 0; k < G->arcnum; k++) {
        scanf("%d %d", &i, &j);
        s = (EdgeNode *) malloc(sizeof(EdgeNode));
        s->adjvex = j;
        s->next = G->adjlist[i].firstedge;
        G->adjlist[i].firstedge = s;
        r = (EdgeNode *) malloc(sizeof(EdgeNode));
        r->adjvex = i;
        r->next = G->adjlist[j].firstedge;
        G->adjlist[j].firstedge = r;
    }
}
 
/*  
    TODO: 深度遍历无向图
    功能:使用递归方法,从下标i开始深度遍历无向图,遍历过的顶点将对应visited[i]从FALSE变成TRUE
          并调用上面提供的PVisit(ElemType data)输出遍历过的顶点信息。   
    参数:AlGraph *G是需要操作的图,int i是开始遍历的点的下标
    返回值:无。
*/
void DFS(AlGraph *G, int i) {
visited[i]=true;
    printf("%d ",v);
    ArcNode *w=G.vertices[i].firstarc;
    while(w){
        if(!visited[w->adjvex]) DFS(G,w->adjvex);
        w=w->nextarc;
    }

 
}
 
void DFS_noprint(AlGraph *G, int i) {
    EdgeNode *p;
    visited[i] = TRUE;
    p=G->adjlist[i].firstedge;
    while(p) {
        if (visited[p->adjvex] == FALSE)
            DFS_noprint(G,p->adjvex);    
        p = p->next;
    }
}
 
/*  
    TODO: 判断无向图G是否连通
    功能:将visited[]数组元素全部置为FALSE,使用DFS_noprint对图G进行遍历,
          统计DFS_noprint方法被调用的次数(递归中使用的不算),并返回统计结果。
    参数:AlGraph *G 是需要操作的图,int j是用来统计DFS_noprint被调用次数,初始值为0
    返回值:DFS_noprint被调用次数
*/
int DFS_count(AlGraph *G,int j) {
      for(int i=0;i<G.vexnum;i++) visited[i]=false;
    for(int i=0;i<G.vexnum;i++){
        if(!visited[i]) DFS_noprint(G,i);
    }
}
 
/*  
    TODO: 输出G的连通分量
    功能:重置visited[]数组的状态,都改成FALSE,然后使用DFS循环遍历图
          输出连通分量前,printf("第%d个连通变量:", ++j),j为一个变量,初始值0
          每输出完一个连通分量,使用printf("\n")进行换行
          
    参数:AlGraph *G是需要操作的图,int i是顶点下标
    返回值:无。
    举例:第1个连通变量:1 4 5 2 3
          第2个连通变量:6
*/
void DFSTraverse(AlGraph *G,int i) {
     for(int i=0;i<G.vexnum;i++) visited[i]=false;
    for(int i=0;i<G.vexnum;i++){
        if(!visited[i]) DFS(G,i);
    }
}