void CreatMGraph(MGraph &G) { int i,j,k; scanf("%d,%d",&G.vexnum,&G.arcnum); 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]); for(k=0;k<G.arcnum;k++) { scanf("%d,%d",&i,&j); G.arcs[i][j]=1; } for(i=0;i<G.arcnum;j++) { printf("%d:",i); for(j=0;j<G.vexnum;j++) { for(k=0;k<G.vexnum;k++) { if(G.arcs[j][k]==1) { printf(" %d",k); } } } printf("\n"); } }
时间: 2024-03-23 21:37:31 浏览: 62
这是一个创建无向图的邻接矩阵的函数,代码中存在一些问题,我来解释一下:
```c++
void CreatMGraph(MGraph &G) {
int i,j,k;
scanf("%d,%d",&G.vexnum,&G.arcnum); // 输入节点数和边数
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]); // 输入节点名称
for(k=0;k<G.arcnum;k++) // 输入每条边的两个节点
{
scanf("%d,%d",&i,&j);
G.arcs[i][j]=1; // 将邻接矩阵中对应的位置赋值为1
G.arcs[j][i]=1; // 对称位置也赋值为1,因为是无向图
}
for(i=0;i<G.vexnum;i++) // 遍历每一个节点
{
printf("%d:",i);
for(j=0;j<G.vexnum;j++) // 遍历邻接矩阵中的每一行
{
if(G.arcs[i][j]==1) // 如果当前节点和邻接矩阵中的节点j有连接
{
printf(" %d",j); // 输出j节点的名称
}
}
printf("\n"); // 换行
}
}
```
代码中存在以下问题:
1. 在输入节点名称时,使用了`%c`格式化字符,这会导致输入时会把回车等非数字字符也读入,可以使用`%s`格式化字符串来输入节点名称,或者在输入节点名称前加上一个空格,如`scanf(" %c",&G.vexs[i])`。
2. 在遍历每一个节点时,输出格式有误。应该是输出当前节点的名称后,再遍历与该节点有连接的节点,输出这些节点的名称。
3. 在遍历每一个节点时,只需要遍历邻接矩阵中的该节点所在行,而不需要遍历整个邻接矩阵,可以将第二个for循环的结束条件改为`j<G.vexnum`。
4. 在遍历每一个节点时,输出的节点名称应该从0开始,而不是从i开始。
阅读全文