void Graph(){ int n; do{ printf("\n"); printf("图的基本操作及应用*\n"); printf("* 1 创建(邻接矩阵/邻接表) \n"); printf(" 2 深度优先遍历 \n"); printf(" 3 广度优先遍历 \n"); printf(" 4 找第一个邻接点 \n"); printf(" 5 找下一个邻接点 \n"); printf(" 6 应用 \n"); printf(" 7 退出 \n"); printf("**************************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n){ case 1: printf("---------创建(邻接矩阵/邻接表)-------");break; case 2: printf("---------深度优先遍历-------");break; case 3: printf("---------广度优先遍历-------");break; case 4: printf("---------找第一个邻接点-------");break; case 5: printf("---------找下一个邻接点-------");break; case 6: printf("---------应用-------");break; case 7:break; default: printf("ERROR!");break; } }while(n!=7); }完善这段代码使之能够成功实现创建(邻接矩阵/邻接表)深度优先遍历广度优先遍历找第一个邻接点-找下一个邻接点-并且能够运行且功能完整

时间: 2023-07-23 22:42:34 浏览: 51
这段代码只是一个菜单,需要在每个选项中添加相应的函数调用才能实现相应的功能。以下是完整代码: ```c #include<stdio.h> #include<stdlib.h> #define MAXV 100 //最大顶点数 //邻接矩阵存储结构 typedef struct{ int vexs[MAXV]; //顶点数组 int arc[MAXV][MAXV]; //邻接矩阵 int vexnum, arcnum; //顶点数和边数 }MGraph; //邻接表存储结构 typedef struct ArcNode{ int adjvex; //邻接点在顶点数组中的位置 struct ArcNode *next; //下一个邻接点指针 }ArcNode; typedef struct VNode{ int data; //顶点数据 ArcNode *first; //第一个邻接点指针 }VNode, AdjList[MAXV]; typedef struct{ AdjList vertices; //邻接表数组 int vexnum, arcnum; //顶点数和边数 }ALGraph; //函数声明 void CreateMGraph(MGraph *G); //创建邻接矩阵 void CreateALGraph(ALGraph *G); //创建邻接表 void DFS(MGraph G, int v, int visited[]); //深度优先遍历邻接矩阵 void BFS(ALGraph G, int v, int visited[]); //广度优先遍历邻接表 int FirstAdjVex(MGraph G, int v); //找第一个邻接点 int NextAdjVex(MGraph G, int v, int w); //找下一个邻接点 void Graph(); //菜单函数 int main(){ Graph(); return 0; } void CreateMGraph(MGraph *G){ int i, j, k, w; printf("请输入顶点数和边数:"); scanf("%d%d", &G->vexnum, &G->arcnum); printf("请输入顶点数据:"); for(i = 0; i < G->vexnum; i++){ scanf("%d", &G->vexs[i]); } for(i = 0; i < G->vexnum; i++){ for(j = 0; j < G->vexnum; j++){ G->arc[i][j] = 0; //初始化邻接矩阵 } } printf("请输入边的信息(起点 终点 权值):"); for(k = 0; k < G->arcnum; k++){ scanf("%d%d%d", &i, &j, &w); G->arc[i][j] = w; G->arc[j][i] = w; //无向图,矩阵对称 } } void CreateALGraph(ALGraph *G){ int i, j, k, w; ArcNode *p; printf("请输入顶点数和边数:"); scanf("%d%d", &G->vexnum, &G->arcnum); printf("请输入顶点数据:"); for(i = 0; i < G->vexnum; i++){ scanf("%d", &G->vertices[i].data); G->vertices[i].first = NULL; //初始化邻接表 } printf("请输入边的信息(起点 终点 权值):"); for(k = 0; k < G->arcnum; k++){ scanf("%d%d%d", &i, &j, &w); //创建边表结点 p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = j; p->next = G->vertices[i].first; G->vertices[i].first = p; //对称地创建边表结点 p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = i; p->next = G->vertices[j].first; G->vertices[j].first = p; } } void DFS(MGraph G, int v, int visited[]){ int w; printf("%d ", G.vexs[v]); visited[v] = 1; //标记已访问 for(w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w)){ if(!visited[w]){ DFS(G, w, visited); } } } void BFS(ALGraph G, int v, int visited[]){ int w; int queue[MAXV], front = 0, rear = 0; ArcNode *p; printf("%d ", G.vertices[v].data); visited[v] = 1; //标记已访问 queue[rear++] = v; while(front < rear){ v = queue[front++]; for(p = G.vertices[v].first; p; p = p->next){ w = p->adjvex; if(!visited[w]){ printf("%d ", G.vertices[w].data); visited[w] = 1; queue[rear++] = w; } } } } int FirstAdjVex(MGraph G, int v){ int i; for(i = 0; i < G.vexnum; i++){ if(G.arc[v][i] != 0){ return i; //返回第一个邻接点 } } return -1; //没有邻接点 } int NextAdjVex(MGraph G, int v, int w){ int i; for(i = w + 1; i < G.vexnum; i++){ if(G.arc[v][i] != 0){ return i; //返回下一个邻接点 } } return -1; //没有邻接点 } void Graph(){ int n; int visited[MAXV] = {0}; //初始化访问标记数组 MGraph G1; ALGraph G2; do{ printf("\n"); printf("图的基本操作及应用*\n"); printf("* 1 创建(邻接矩阵) \n"); printf(" 2 创建(邻接表) \n"); printf(" 3 深度优先遍历(邻接矩阵) \n"); printf(" 4 广度优先遍历(邻接表) \n"); printf(" 5 找第一个邻接点(邻接矩阵) \n"); printf(" 6 找下一个邻接点(邻接矩阵) \n"); printf(" 7 退出 \n"); printf("**************************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n){ case 1: printf("---------创建(邻接矩阵)-------\n"); CreateMGraph(&G1); break; case 2: printf("---------创建(邻接表)-------\n"); CreateALGraph(&G2); break; case 3: printf("---------深度优先遍历(邻接矩阵)-------\n"); DFS(G1, 0, visited); printf("\n"); break; case 4: printf("---------广度优先遍历(邻接表)-------\n"); BFS(G2, 0, visited); printf("\n"); break; case 5: printf("---------找第一个邻接点(邻接矩阵)-------\n"); printf("请输入顶点编号:"); scanf("%d", &n); printf("第一个邻接点为:%d\n", FirstAdjVex(G1, n)); break; case 6: printf("---------找下一个邻接点(邻接矩阵)-------\n"); printf("请输入顶点编号和邻接点编号:"); scanf("%d%d", &n, &visited[0]); printf("下一个邻接点为:%d\n", NextAdjVex(G1, n, visited[0])); break; case 7: break; default: printf("ERROR!\n"); break; } }while(n != 7); } ```

相关推荐

#include<stdio.h> #include<stdlib.h> Typedef struct Graph{ Char* vexs; Int** arcs; Int vexnum,arcnum; )Graph; Graph* initGraph(int vexnum){ Graph* G=(Graph*)malloc(sizeof(Graph)) G->vexs=(char*)malloc(sizeof (char)*vexnum) G->arcs=(int**)malloc(sizeof (int*)*vexnum) For(int i=0;i<vexnum;I++) { G->arcs[i]= (int*)malloc(sizeof (int)*vexnum)} G->vexnum=Vexnum; G->arcnum=0; Return G } Int createGraph(Graph* G,char* vexs,int* arcs) {for(i=0;i<G->vexnum;i++) G->vexs[i]=vexs[i]; For((j=0;j<G->vexnum;j++) G->arcs[i][j]=*(arcs+i*vexnum+j ) If(G->arcs[i][j]!=0) G->arcnum++; } G->arcnum/=2; } Void DFS(Graph* G,int *visit,int index){ Printf("%c",G->vexs[index]) Visit[index]=1; For(int i=0;i<G->vexnum;i++) If(G->arcs[index][i]==1&&visit[index]!=1) DFS(G,visit,i) } Void BFS(Graph* G,int *visit ,int index){ Printf("%c",&G->vexs[index]) Visit[index]=1; Queue* initQueue(); enQueue(Q,index); while(!isEmpty(Q)) int i=deQueue(); For(int j=0;j<G->vexnum;J++) If(G->arcs[i][j]==1&&!visit[j]) Printf("%c",G->vexs[j]) Visit[j]=1; enQueue(Q,j);} } #define MAXSIZE 5 Typedef struct Queue{ Int front Int rear Int data[MAXSIZE] }Queue; Queue* Q InitQueue() { Queue* Q=(Queue*)malloc(sizeof(QUeue)); Queue->front=Queue->rear=0; Return Q; } Int enQueue(Queue* Q, int data) If (isFull(Q)){ Return 0} Else Q->data[Q->rear]=data; Q->rear=(Q->rear+1)%MAXSIZE } Int deQueue(Queue* Q) If (isempty(Q)){ Return 0} Else Int data=Q->data[Q->front]; Q->front=(Q->front+1)%MAXSIZE Return data; } Void printfQueue(Queue* Q){ Int length=(Q->rea-Q->front+MAXSIZE)%MAXSIZE For(int i=0;i<length;i++) Printf("%d->",Q->data[Q->front]) Q->front=(Q->front+1)%MAXSIZE; Int main(){ Graph* G=initGraph(5); Int arcs[5][5]={ 0,1,1,1,0, 0,1,1,1,0, 0,1,1,1,0, 0,1,1,1,0, 0,1,1,1,0, }; CreateGraph(*G,"ABCDE",(int*)arcs); Int* visit=(int*)malloc(sizeof(int)*G->vexnum); For(int i=0;i<G->vexnum;i++) Visit[i]=0; DFS(G,visit,0); BFS(G,visit,0) }修改正确并转化为c语言代码

完善代码:#include <stdio.h> #include <stdlib.h> #define INF 50 typedef struct ArcNode{ int adjvex;//该弧所指向的顶点位置 struct ArcNode *nextarc;//下一个临接点 int weight;//弧的权重 }ArcNode;//表结点 typedef struct VNode{ char data; //顶点信息 ArcNode *firstarc;//指向下一个结点. }VNode,AdjList[6]; typedef struct{ AdjList LH;//创建头结点数组 int vexnum;//图的点的个数 int arcnum;//图的边的个数 }Graph; typedef struct{ char nextvex; int lowcost; int know; }Auxiliary_array;//辅助数组结构体 voidmain (void){ void buildtu (Graph*); void printgraph(Graph*); void prim( Graph *G, char u); char u; Graph UDG; Graph *G = &UDG; buildtu(G); printgraph(G);//打印图 printf("请输入起始顶点: \n"); while(getchar()!=')n'); u = getchar(); prim(G,u); } void buildtu (Graph*G) { //建图 int search(Graph *G,char a); int i,n1,n2,w;char a,b; ArcNode *p, *q; printf("请输入顶点个数和边的条数: \n"); scanf("%d %d",&G->vexnum,&G->arcnum); printf("请输入顶点信息\n"); for (i= 0;i< G->vexnum; ++i){ while (getchar()!='\n'); scanf("%c" ,&G->LH[i].data); G->LH[i].firstarc = NULL; } printf(" 请输入有关系的结点和该边的权重:\n");for(i=0;i<G->arcnum;++i){ while (getchar()!='\n'); scanf("%c %c %d",&a,&b,&w); n1=search(G,a); n2=search(G,b); p=G->LH[n1].firstarc; if(p == NULL){ p=G->LH[n1].firstarc=(ArcNode *) malloc (sizeof(ArcNode)); } else{ while(p->nextarc!=NULL){ p=p->nextarc; } p=p->nextarc=(ArcNode*)malloc(sizeof(ArcNode)); }

最新推荐

recommend-type

毕业设计MATLAB_执行一维相同大小矩阵的QR分解.zip

毕业设计matlab
recommend-type

ipython-7.9.0.tar.gz

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

debugpy-1.0.0b3-cp37-cp37m-manylinux2010_x86_64.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB柱状图在数据分析中的作用:从可视化到洞察

![MATLAB柱状图在数据分析中的作用:从可视化到洞察](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB柱状图概述** 柱状图是一种广泛用于数据可视化的图表类型,它使用垂直条形来表示数据中不同类别或组别的值。在MATLAB中,柱状图通过`bar`函数创建,该函数接受数据向量或矩阵作为输入,并生成相应的高度条形。 柱状图的优点在于其简单性和易于理解性。它们可以快速有效地传达数据分布和组别之间的比较。此外,MATLAB提供了广泛的定制选项,允许用户调整条形颜色、