#include <stdio.h> #define INFINITY 32768 typedef enum{DG,DN,UDG,UDN}GraphKind; #define MaxVexNum 20 //最大顶点数目 typedef char ElemType; typedef struct { ElemType vexs[MaxVexNum]; int arcs[MaxVexNum][MaxVexNum]; int vexnum, arcnum; }AMGraph; typedef struct ArcNode{ int adj; }ArcNode; int locate(AMGraph G,char v) { int k; for(k=0;k<G.vexnum;k++) { if(G.vexs[k]==v) { return k; } } return -1; } void CreatMGraph(AMGraph G) { int i,j,k; char v1,v2; scanf("%d%d",&G.vexnum,&G.arcnum); getchar(); for(i=0;i<G.vexnum;i++) { for(j=0;j<G.vexnum;j++) { G.arcs[i][j]=0; } } for(i=0;i<G.vexnum;i++) { scanf("%c",&G.vexs[i]); } getchar(); for(k=0;k<G.arcnum;k++) { scanf("%c%c",&v1,&v2); getchar(); i=locate(G,v1); j=locate(G,v2); G.arcs[i][j]=1; G.arcs[j][i]=1; } } int visited[MaxVexNum]; void DepthFirstSearch(AMGraph g,int v0) { printf("%c",g.vexs[v0]);visited[v0]=1; for(int vj=0;vj<g.vexnum;vj++) { if(!visited[vj]&&g.arcs[v0][vj]==1) { DepthFirstSearch(g,vj); } } } void TraverseGraph(AMGraph g) { for(int vi=0;vi<g.vexnum;vi++) { visited[vi]=0; } for(int vi=0;vi<g.vexnum;vi++) { if(!visited[vi]) DepthFirstSearch(g,vi); } } int main() { AMGraph G; CreatMGraph(G); TraverseGraph(G); return 0; }哪错了
时间: 2024-01-14 18:02:19 浏览: 146
SeqList.h #include <stdio.h> //包含标准输入输出流的头文件 #include <assert.h
在该程序中存在以下问题:
1. 在函数 `CreatMGraph` 中,应该传入指针类型的参数 `AMGraph *G`,否则函数中对 `G` 的修改不会影响到主函数中的 `G` 变量。
2. 在 `CreatMGraph` 中,应该使用 `scanf("%d%d",&G->vexnum,&G->arcnum);` 以及 `scanf(" %c",&G->vexs[i]);` 和 `scanf("%c%c",&v1,&v2); getchar();`,其中 `%d` 和 `%c` 之间应该加上空格,否则会有输入格式上的问题。
3. 在 `DepthFirstSearch` 函数中,应该在递归调用前先进行标记,否则会死循环或者输出结果不正确。
修改后的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#define INFINITY 32768
#define MaxVexNum 20
typedef char ElemType;
typedef enum {DG, DN, UDG, UDN} GraphKind;
typedef struct {
ElemType vexs[MaxVexNum];
int arcs[MaxVexNum][MaxVexNum];
int vexnum, arcnum;
} AMGraph;
void CreatMGraph(AMGraph *G) {
int i, j, k;
char v1, v2;
scanf("%d%d", &G->vexnum, &G->arcnum);
getchar();
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = 0;
}
}
for (i = 0; i < G->vexnum; i++) {
scanf(" %c", &G->vexs[i]);
}
getchar();
for (k = 0; k < G->arcnum; k++) {
scanf("%c%c", &v1, &v2);
getchar();
i = locate(*G, v1);
j = locate(*G, v2);
G->arcs[i][j] = 1;
G->arcs[j][i] = 1;
}
}
int locate(AMGraph G, char v) {
int k;
for (k = 0; k < G.vexnum; k++) {
if (G.vexs[k] == v) {
return k;
}
}
return -1;
}
int visited[MaxVexNum];
void DepthFirstSearch(AMGraph g, int v0) {
visited[v0] = 1;
printf("%c", g.vexs[v0]);
for (int vj = 0; vj < g.vexnum; vj++) {
if (!visited[vj] && g.arcs[v0][vj] == 1) {
DepthFirstSearch(g, vj);
}
}
}
void TraverseGraph(AMGraph g) {
for (int vi = 0; vi < g.vexnum; vi++) {
visited[vi] = 0;
}
for (int vi = 0; vi < g.vexnum; vi++) {
if (!visited[vi]) {
DepthFirstSearch(g, vi);
}
}
}
int main() {
AMGraph G;
CreatMGraph(&G);
TraverseGraph(G);
return 0;
}
```
阅读全文