LLLLLogic 2022-05-21 18:55 采纳率: 60%
浏览 52
已结题

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

#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

  • 写回答

2条回答 默认 最新

  • 有问必答小助手 2022-05-24 18:58
    关注

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


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

    评论

报告相同问题?

问题事件

  • 系统已结题 5月29日
  • 赞助了问题酬金20元 5月23日
  • 赞助了问题酬金10元 5月21日
  • 创建了问题 5月21日

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算