void creatematrix(graph *g)//邻接矩阵
{
int x,t,i,j;
vertextype e1,e2;
cout<<"输入顶点和边数"<<endl;
cin>>g->numnodes>>g->numedges;
cout<<"输入各个顶点数据"<<endl;
for(i=0;i<g->numnodes;i++)
cin>>g->vexs[i];//输入每个节点的字符数据到顶点表 vexs[0]=A
for(i=0;i<g->numnodes;i++)
{
for(int j=0;i<g->numnodes;j++)
g->arc[i][j]=0;
}//邻接矩阵初始化
cout<<"请输入每条边的两个顶点结点"<<endl;
for(int k=0;k<g->numedges;k++)//输入边数
{
cin>>e1>>e2;
for(i=0;i<g->numnodes;i++)//根据顶点表查找第一个结点
{
if(g->vexs[i]==e1)
break;
}
for(j=0;j<g->numnodes;j++)//根据顶点表查找第二个结点
{
if(g->vexs[j]==e2)
break;
}
g->arc[i][j]=1;
g->arc[j][i]=g->arc[i][j];//无向图的邻接矩阵对称
}
cout<<"邻接矩阵建立完成"<<endl;
}
只能运行到如图部分,按回车之后程序会自动退出
for(i=0;i<g->numnodes;i++)
{
for(int j=0;i<g->numnodes;j++)
g->arc[i][j]=0;
}//邻接矩阵初始化
你这个初始化的内部循环写错了, 内层循环的判定条件是j 不是 i
你写错会导致循环是数组越界,越界后把 numnodes 的值从3设置为0了
为什么会设置numnodes,这是因为在结构体定的时候,这个arc数组和numnodes是连续的,处于连续存储区
所以数组越界后直接影响了numnodes的值
debug看一下就知道了
numnodes变成0之后,后面的循环条件自然不满足了,所以不打印。
我修改之后就正常了:
还有你这代码风格,建议改下,一个是注释不好看,一个是代码太密,专门去学下编码风格吧。
//邻接矩阵初始化
for(i = 0; i < g->numnodes; i++) {
for(int j=0; j < g->numnodes; j++) {
g->arc[i][j] = 0;
}
}
这样岂不是更舒服,也能更快发现问题
退出正常,如果你建完邻接矩阵之后没什么需要跑很久的逻辑,main执行完自动就关闭DOS窗口了。
你想窗口不关闭,就在main函数的最后加一行代码:
int main(void) {
// .... 你的代码
creatematrix(g); // 构造邻接矩阵
// .... 你的代码
system("pause"); //保持DOS不关闭
return 0;
}
#define maxvex 10
#include <iostream>
using namespace std;
int visit[maxvex];
typedef char vertextype;//结点数据
typedef struct
{
vertextype vexs[maxvex];//顶点表
int arc[maxvex][maxvex];//邻接矩阵
int numnodes,numedges;
}graph;
void creatematrix(graph *g)//邻接矩阵
{
int i,j;
vertextype e1,e2;
cout<<"输入顶点和边数"<<endl;
cin>>g->numnodes>>g->numedges;
cout<<"输入各个顶点数据"<<endl;
for(i=0;i<g->numnodes;i++)
cin>>g->vexs[i];//输入每个节点的字符数据到顶点表 vexs[0]=A
for(i=0;i<g->numnodes;i++)
{
for(int j=0;i<g->numnodes;j++)
g->arc[i][j]=0;
}//邻接矩阵初始化
cout<<"请输入每条边的两个顶点结点"<<endl;
for(int k=0;k<g->numedges;k++)//输入边数
{
cin>>e1>>e2;
for(i=0;i<g->numnodes;i++)//根据顶点表查找第一个结点
{
if(g->vexs[i]==e1)
break;
}
for(j=0;j<g->numnodes;j++)//根据顶点表查找第二个结点
{
if(g->vexs[j]==e2)
break;
}
g->arc[i][j]=1;
g->arc[j][i]=g->arc[i][j];//无向图的邻接矩阵对称
}
cout<<"邻接矩阵建立完成"<<endl;
cout<<"邻接矩阵如下"<<endl;
for(i=0;i<g->numnodes;i++)
{
for(j=0;j<g->numnodes;j++)
cout<<g->arc[i][j];
cout<<endl;
}
}
void matrixoutput(graph g)
{
cout<<"邻接矩阵如下"<<endl;
for(int i=0;i<g.numnodes;i++)
{
for(int j=0;j<g.numnodes;j++)
cout<<g.arc[i][j];
cout<<endl;
}
}
void DFS1(graph g,int i)
{
visit[i]=true;
cout<<g.vexs[i]<<" ";//打印顶点
for(int j=0;j<g.numnodes;j++)//一个连通分量的遍历
if(g.arc[i][j]==1 && !visit[j])
DFS1(g,j);
}
//邻接矩阵的深度遍历
void DFS(graph g)
{
for(int i=0;i<g.numnodes;i++)
visit[i]=0;//初始所有顶点状态都是未访问过状态
for(int i=0;i<g.numnodes;i++)//若是连通图,只会执行一次
if(!visit[i])//对未访问过的顶点调用DFS
DFS1(g,i);
}
main()
{
graph g;
creatematrix(&g);
cout<<"对邻接矩阵进行深度优先遍历"<<endl;
DFS(g);
system("pause");
}