int SearchVex(int x,int y,MGraph *G) { for(int i=1;i<=G->n;i++) { if(x>G->vexs[i].left&&y>G->vexs[i].top&&x<G->vexs[i].right&&y<G->vexs[i].bottom) { printf("选中:%s\n",G->vexs[i].name); return i; } } }
时间: 2023-12-06 17:43:23 浏览: 28
这段代码是一个在图形界面中实现图的顶点选择的函数。函数的输入参数包括鼠标的坐标(x,y)和一个指向图结构体的指针G。函数的返回值是一个整数,表示选择的顶点在图中的序号。
函数通过遍历图中的所有顶点,判断鼠标点击的坐标是否在某个顶点所在的矩形区域内。若是,则说明该顶点被选中,函数将其序号作为返回值返回。如果遍历完所有的顶点后都没有选中任何一个顶点,函数将会默认返回0或者其他特定值,表示未选中任何顶点。
该函数的核心思路比较简单,但需要注意的是,该函数的实现需要保证每个顶点的矩形区域不重叠,否则可能会导致顶点选择出现错误。同时,该函数还可以进一步优化,例如可以采用二分查找等方法提高查找速度。
相关问题
让这段代码正常运行void CreatGraph(MGraph *G, DataType a[ ], int n, int e) { int i, j, k; G->vertexNum = n; G->edgeNum = e; for (i = 0; i < G->vertexNum; i++) /*存储顶点信息*/ G->vertex[i] = a[i]; for (i = 0; i < G->vertexNum; i++) /*初始化邻接矩阵*/ for (j = 0; j < G->vertexNum; j++) G->edge[i][j] = 0; for (k = 0; k < G->edgeNum; k++) /*依次输入每一条边*/ { scanf("%d%d", &i, &j); /*输入边依附的顶点编号*/ G->edge[i][j] = 1; G->edge[j][i] = 1; /*置有边标志*/ } } void DFraverse(MGraph *G, int v) /*全局数组变量visited[n]已初始化为0*/ { printf("%c ", G->vertex[v]); visited[v] = 1; for (int j = 0; j < G->vertexNum; j++) if (G->edge[v][j] == 1 && visited[j] == 0) DFSTraverse(G, j); }
这段代码存在两个问题:
1. 在函数DFraverse()中,调用了未定义的函数DFSTraverse(),应该改为调用DFraverse()。
2. 函数DFraverse()中使用了全局数组visited[],但是该数组未在代码中定义,需要先定义一个全局数组visited[],并初始化为0。
修改后的代码如下:
```
#define MAX_VERTEX_NUM 100
typedef char DataType;
typedef struct {
DataType vertex[MAX_VERTEX_NUM]; // 顶点信息
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vertexNum, edgeNum; // 顶点数和边数
} MGraph;
int visited[MAX_VERTEX_NUM]; // 全局数组visited[],初始化为0
void CreatGraph(MGraph *G, DataType a[], int n, int e) {
int i, j, k;
G->vertexNum = n;
G->edgeNum = e;
for (i = 0; i < G->vertexNum; i++) // 存储顶点信息
G->vertex[i] = a[i];
for (i = 0; i < G->vertexNum; i++) // 初始化邻接矩阵
for (j = 0; j < G->vertexNum; j++)
G->edge[i][j] = 0;
for (k = 0; k < G->edgeNum; k++) // 依次输入每一条边
{
scanf("%d%d", &i, &j); // 输入边依附的顶点编号
G->edge[i][j] = 1;
G->edge[j][i] = 1; // 置有边标志
}
}
void DFraverse(MGraph *G, int v) {
printf("%c ", G->vertex[v]);
visited[v] = 1;
for (int j = 0; j < G->vertexNum; j++)
if (G->edge[v][j] == 1 && visited[j] == 0)
DFraverse(G, j); // 递归调用DFraverse(),不是DFSTraverse()
}
```
优化这段代码#include<stdio.h> #include<stdlib.h> #define Maxsize 10 int visited[Maxsize]={0}; typedef char DataType; typedef struct { DataType vertex[Maxsize]; int edge[Maxsize][Maxsize]; int vertexNum,edgeNum; }MGraph; void CreatGraph(MGraph*G,DataType a[],int n,int e) { int i,j,k; G->vertexNum=n; G->edgeNum=e; for(i=0;i<G->vertexNum;i++) { G->vertex[i]=a[i]; } for(i=0;i<G->vertexNum;i++) { for(j=0;j<G->vertexNum;j++) { G->edge[i][j]=0; } } printf("输入边的位置:"); for(k=0;k<=G->edgeNum;k++) { scanf("%d%d",&i,&j); getchar(); G->edge[i][j]=1; G->edge[j][i]=1; } } void DFSTraverse(MGraph*G,int v) { printf("%c",G->vertex[v]); visited[v]=1; for(int j=0;j<=G->vertexNum;j++) { if(G->edge[v][j]==1&&visited[j]==0) DFSTraverse(G,j); } } void BFSTraverse(MGraph*G,int v) { printf("%c",G->vertex[v]); visited[v]=1; for(int j=0;j<=G->vertexNum;j++) { if(G->edge[j][v]==1&&visited[v]==0) DFSTraverse(G,j); } } void BFSTraverseclear(MGraph*G) { int i; for(i=1; i<G->vertexNum; i++) { visited[i]=0; } } int main() { MGraph MG; int i,t,h; printf("输入顶点数"); scanf("%d",&t); printf("输入边数"); scanf("%d",&h); char ch[t]; printf("输入顶点值"); for(i=0;i<t;i++) { scanf("%c",&ch[i]); } CreatGraph(&MG,ch,t,h); for(i=0;i<t;i++) visited[i]=0; printf("深度遍历"); DFSTraverse(&MG,0); printf("\n广度遍历"); BFSTraverseclear(&MG); BFSTraverse(&MG,0); return 0; }
首先,可以将一些重复的代码进行封装,例如将深度优先遍历和广度优先遍历中的 visited 数组清零的操作封装成一个函数。同时,在输入边的位置时,可以使用循环而非递归,避免重复代码。
下面是优化后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 10
typedef char DataType;
typedef struct {
DataType vertex[Maxsize];
int edge[Maxsize][Maxsize];
int vertexNum, edgeNum;
} MGraph;
int visited[Maxsize] = {0};
void CreatGraph(MGraph *G, DataType a[], int n, int e) {
int i, j, k;
G->vertexNum = n;
G->edgeNum = e;
for (i = 0; i < G->vertexNum; i++) {
G->vertex[i] = a[i];
}
for (i = 0; i < G->vertexNum; i++) {
for (j = 0; j < G->vertexNum; j++) {
G->edge[i][j] = 0;
}
}
printf("输入边的位置:");
for (k = 0; k < G->edgeNum; k++) {
scanf("%d%d", &i, &j);
getchar();
G->edge[i][j] = 1;
G->edge[j][i] = 1;
}
}
void TraverseClear(MGraph *G) {
int i;
for (i = 0; i < G->vertexNum; i++) {
visited[i] = 0;
}
}
void DFS(MGraph *G, int v) {
printf("%c", G->vertex[v]);
visited[v] = 1;
for (int j = 0; j < G->vertexNum; j++) {
if (G->edge[v][j] == 1 && visited[j] == 0) {
DFS(G, j);
}
}
}
void DFSTraverse(MGraph *G, int v) {
TraverseClear(G);
DFS(G, v);
}
void BFS(MGraph *G, int v) {
int queue[Maxsize], front = 0, rear = 0;
printf("%c", G->vertex[v]);
visited[v] = 1;
queue[rear++] = v;
while (front != rear) {
int w = queue[front++];
for (int j = 0; j < G->vertexNum; j++) {
if (G->edge[w][j] == 1 && visited[j] == 0) {
printf("%c", G->vertex[j]);
visited[j] = 1;
queue[rear++] = j;
}
}
}
}
void BFSTraverse(MGraph *G, int v) {
TraverseClear(G);
BFS(G, v);
}
int main() {
MGraph MG;
int t, h;
printf("输入顶点数:");
scanf("%d", &t);
printf("输入边数:");
scanf("%d", &h);
char ch[t];
printf("输入顶点值:");
for (int i = 0; i < t; i++) {
scanf(" %c", &ch[i]);
}
CreatGraph(&MG, ch, t, h);
printf("深度遍历:");
DFSTraverse(&MG, 0);
printf("\n广度遍历:");
BFSTraverse(&MG, 0);
return 0;
}
```
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)