/*
名称:图的一些基本相关操作函数
说明:为了后面图的遍历等高层次一点应用,在这里先敲出一些有待调用基本函数。包括求对应结点的编号,求对应结点的名称、创建树、等等。在这里分别用临接矩阵和临接表实现来了上述操作。
*/
///////////////////////////
//临接矩阵构造的图的相关函数操作
///////////////////////////
//求图G中顶点x的第一个临接点,如果有返回其下标,否则返回-1
int FirstNeighbor1(MGraph G,int x)
{
if(x >= MaxVertexNum)
return -1;
for(int i = 0;i < MaxVertexNum;++i )
{
if(G.Edge[x][i] >= 0 && G.Edge[x][i] < MaxDis )
return i;
}
return -1;
}
//假设G中顶点y是顶点x的一个相邻结点,返回除y之外顶点x的下一个临接点的定点号,若y是最后一个顶点则返回-1
int NextNeighbor1(MGraph G,int x,int y)
{
if(x >= MaxVertexNum)
return -1;
for(int i = y+1;i < MaxVertexNum;++i )
{
if(G.Edge[x][i] >= 0 && G.Edge[x][i] < MaxDis )
return i;
}
return -1;
}
//确定顶点v(此处用字符v表示)在临接矩阵中顶点表中的位置
int LocateVex1(MGraph G,char v)
{
for(int i = 0;i<G.vexnum;++i)
{
if(G.Vex[i] == v)
return i;
}
return -1;
}
//返回图中pos位置对应的点,此处是字符形式的
VexType GetVex1(MGraph G,int pos)
{
if(pos >= G.vexnum) //如果输入的不合法返回N
return 'N';
else
return G.Vex[pos];
}
//临接矩阵创建图
void CreateGraph1(MGraph &G)
{
int vexnum = 0; //顶点数
int i = 0,j = 0;
cout<<"please input vexnums of the MGraph:";
cin>>vexnum; //输入顶点数
G.vexnum = vexnum;
cout<<"please input vertex table:";
for(i = 0;i<vexnum;++i)
{
cin>>G.Vex[i];
}
//初始化临接矩阵,都设为最大的距离,即为不可达
for(i = 0;i<vexnum;++i)
for(int j = 0;j<vexnum;++j)
{
if(i == j)
G.Edge[i][j] = 0;
else
G.Edge[i][j] = MaxDis;
}
//memset(G.Edge,MaxDis,sizeof(int)*MaxVertexNum*MaxVertexNum); //为什么用这种方式初始化不行?
// cout<<"test Edge[0][0]"<<G.Edge[0][0]<<endl;
char vex1,vex2; //两个顶点
int dis = 0;
cout<<"please input an arc and it's distance:";
cin>>vex1;
while(vex1 != 'E') //E 表示输入结束
{
cin>>vex2>>dis;
i = LocateVex1(G,vex1); //确定第一个顶点在临接矩阵中的位置
j = LocateVex1(G,vex2); //确定第二个顶点在临接矩阵中的位置
G.Edge[i][j] = dis; //将对应的位置赋值距离
G.arcnum++; //边数加1
cin>>vex1;
}
}
///////////////////////////
//临接表构造的图的相关函数操作
///////////////////////////
//确定顶点v(此处用字符v表示)在临接矩阵中顶点表中的位置
int LocateVex2(ALGraph G,char v)
{
for(int i = 0;i<G.vexnum;++i)
{
if(G.vertices[i].vex == v)
return i;
}
return -1;
}
//返回图中pos位置对应的点,此处是字符形式的
VexType GetVex2(ALGraph G,int pos)
{
if(pos >= G.vexnum) //如果输入的不合法返回N
return 'N';
else
return G.vertices[pos].vex;
}
//采用邻接表创建图
void CreateGraph2(ALGraph &G)
{
int vexnum = 0; //顶点数
int i = 0,j = 0;
cout<<"please input vexnums of the ALGraph:";
cin>>vexnum; //输入顶点数
G.vexnum = vexnum;
cout<<"please input vertex table:";
for(i = 0;i<vexnum;++i)
{
cin>>G.vertices[i].vex;
}
//初始化临接表,即将邻接表中顶点表的first置为空,表示初始时没有边
for(i = 0;i<G.vexnum;++i)
G.vertices[i].first = NULL;
char vex1,vex2; //两个顶点
int dis = 0;
cout<<"please input an arc and it's distance:";
cin>>vex1;
while(vex1 != 'E')
{
cin>>vex2>>dis;
i = LocateVex2(G,vex1); //确定第一个顶点(源点)在临接表中的位置
j = LocateVex2(G,vex2); //确定第二个顶点(终点)在临接矩阵中的位置
//在临接表中插入边结点(链表相关操作)
ArcNode * temp = G.vertices[i].first;
ArcNode * pre = temp;
while(temp != NULL)
{
pre = temp;
temp = temp->next;
}
ArcNode *temp_new = new ArcNode; //构造新的边结点
temp_new->adjvex = j;
//结点没插入成功??????
if(pre != NULL)
{
temp_new->next = pre->next;
pre->next = temp_new;
}
else
{
temp_new->next = NULL;
G.vertices[i].first = temp_new;
}
G.arcnum++; //边数加1
cin>>vex1;
}
}
//求图G中顶点x的第一个临接点,如果有返回其下标,否则返回-1(邻接表)
int FirstNeighbor2(ALGraph G,int x)
{
if(x >= MaxVertexNum)
return -1;
if(G.vertices[x].first != NULL)
return G.vertices[x].first->adjvex;
else
return -1;
}
//(邻接表)假设G中顶点y是顶点x的一个相邻结点,返回除y之外顶点x的下一个临接点的定点号,若y是最后一个顶点则返回-1
int NextNeighbor2(ALGraph G,int x,int y)
{
ArcNode * temp = G.vertices[x].first;
while(temp != NULL)
{
if(temp->adjvex == y)
break;
else
temp = temp->next;
}
if(temp == NULL ||temp->next == NULL)
return -1;
else
return temp->next->adjvex;
}