#include<stdio.h>
//思路
//1.无向网,由一个顶点表和邻接矩阵构成
//2.一维数组存储顶点表,二维数组建立邻接矩阵(用于表示各顶点的关系)
//问题3.原来顶点表是用的数字,而不是字符,不过字符也行
//////4.
#define MVNum 100
#define MaxInt 0 //用这个表示无穷大
//#define Infinity (~(1<<(sizeof(int)*8-1)))//这个才是真正的无穷
/*不会使用
表示1左移4*8-1位 然后取反,
int(int为四字节时,int在有的电脑上不是四字节)的最大值,
当两点之间不邻接时,将两点之间的权值设为int的最大值,
在输出时,用“∞”表示。
*/
typedef struct
{
int vexs[MVNum];//一维数组弄顶点表
int arcs[MVNum][MVNum];//二维数组建立邻接矩阵
int dd,bs;//顶点和边数
} AMGraph;
int LocateVex(AMGraph G,int u)
{
for(int i=0;i<G.dd;i++)
{
if(G.vexs[i]==u)
{
//printf("ok\n");
return i;
}
}
printf("错误,因输入的数字并不在顶点表中\n ");
return 0;//返回-1的话就是错误了,说明输入的字符并不在顶点表中
}
void dayin(AMGraph G)
{
int i=0,j=0;
printf("打印邻接矩阵\n");
for(i=0;i<G.dd;i++)
{
for(j=0;j<G.dd;j++)
{
printf("%d ",G.arcs[i][j]);
}
printf("\n");
}
}
void CreateUDN(AMGraph &G)
{
int i=0,j=0;
printf("1.请输入总的顶点数和总边数\n");
scanf("%d%d",&G.dd,&G.bs);//1.输入总顶点数和总边数
printf("2.初始化邻接矩阵,都填入无穷\n") ;
for(i=0;i<G.dd;i++) //这个条件为啥都用顶点数来判断,因为矩阵是行和列相同的
{
for(j=0;j<G.dd;j++)//2..初始化邻接矩阵,都填入无穷;
{
G.arcs[i][j]=MaxInt;
//下面这步不知道要干啥
//if(i==j)
// G.vexs[i][j]=0; //将顶点与自身的权值初始化为0
}
}
dayin(G);
//3.将顶点信息按照输入顺序存入到顶点数组中
printf("3.将顶点信息按照输入顺序存入到顶点数组中\n");
for(i=0;i<G.dd;i++)
{
printf("请输入第%d个顶点的值:", i + 1);//这个提示真的很好用
scanf("%d",&G.vexs[i]);//2.依次存入想要的顶点表的顶点信息 ,在这里忘记加i了
//为啥在这里输入两个循环就结束了??
}
printf("\n");
//4.构造邻接矩阵
int w=0;//这里为何w为char
int k=0;
i=0,j=0;
int v1=0,v2=0;//主要是这个一开始应该弄好初值; 用来放顶点的数值
printf("4.填入权值\n");
//scanf("%d",&v1);//为啥我的scanf不能执行
//printf("111\n");
for(k=0;k<G.bs;++k)
{
printf("请输入这三个信息(顶点 顶点 权值):\n");
scanf("%d%d%d",&v1,&v2,&w);
i=LocateVex(G,v1);//递归回去找到该顶点对应的下标
j=LocateVex(G,v2);
//printf("i=%d j=%d \n",i,j);
G.arcs[i][j]=w;//把权值放入
//G.arcs[j][i]=G.arcs[i][j];//因为这是无向图,所以他的矩阵是对称的
G.arcs[j][i]=w;//把权值放入
}
}
int main()
{
printf("阿祥玩无向网\n");
AMGraph G;
CreateUDN(G);//创建邻接
//不理解为啥 i=-1;
dayin(G);
return 0;
}