学习笔记
邻接矩阵算法
增加顶点
void insertVex(AdjMatrix *G,char e)//插入顶点 {
int i,j;
G->Vertex[G->vexnum++] = e;
i=DNlocation(*G,e);
j=DNlocation(*G,e);
int m=i,n=j;
for(j=0;j<G->vexnum;j++)
{
G->arcs[m][j].adj=INFNITY;
}
for(i=0;i<G->vexnum;i++)
{
G->arcs[i][n].adj=INFNITY;
} }
删除顶点
void deleteVex(AdjMatrix *G,char vex)//删除顶点 {
int i,j;
int location;
location= DNlocation(*G,vex);
printf("顶点的下标是:%d\n",location);
//删除顶点集
for ( i = location+1; i < G->vexnum; i++)
{
G->Vertex[i-1] = G->Vertex[i];
}
//vex下面的上移
for (i = location+1; i < G->vexnum; i++)
{
for ( j = 0; j < G->vexnum; j++)
{
G->arcs[i-1][j] = G->arcs[i][j];
}
}
//vex右边的左移
for (i = location + 1; i < G->vexnum; i++)
{
for ( j = 0; j < G->vexnum; j++)
{
G->arcs[j][i-1] = G->arcs[j][i];
}
}
//清理垃圾数据(第vexNum行 和 第vexNum列)
int maxvexnum = G->vexnum;
int weight = INFNITY;/*带权图,权重就是无穷*/
// int weight = 0; /*不带权图,是 0 */
/*
for (i = 0; i < maxvexnum; i++)
{
G->arcs[maxvexnum-1][i].adj = weight;
G->arcs[i][maxvexnum-1].adj = weight;
}
G->vexnum--;}
插入弧
int insertArc(AdjMatrix *G,char vex1,char vex2,int weight)//插入弧 {
//char v1,v2;
// v1=getch();
int I = DNlocation(*G,vex1);
// v2=getch();
int II = DNlocation(*G,vex2);
printf("要插入的弧所在的矩阵位置是:\n");
printf("%d,%d\n",I,II);
G->arcs[I][II].adj = weight;
// int weight;
/* if( (I!=II) && (I!=-1) && (II!=-1))
{
printf("请输入权重:\n");
scanf("%d",&weight);
return 1;
}*/
/* else if((I==II)&&((I!=-1)||(II!=-1)))
{
G->arcs[I][II].adj = INFNITY ;
return 1;
}
else if((I==-1)||(II==-1))*/
return 0;
}
删除弧
int deleteArc(AdjMatrix *G)//删除弧 {
char v1,v2;
v1=getch();
int I = DNlocation(*G,v1);
v2=getch();
int II = DNlocation(*G,v2);
printf("删除的弧的位置是:%d,%d\n",I,II);
if(I>-1 && I<G->vexnum && II>-1 && II<G->vexnum )
{
G->arcs[I][II].adj =INFNITY;
return 1;
}
else
return 0; }
小结
这周除了研究领接矩阵的算法外,还学习了邻接表的画法,邻接表和邻接矩阵的两种遍历方法,有广度遍历和深度遍历法,还有最小生成树的画法,以及连通图,强连通图的关系,区别,应用的公式等等,后续还会更新。