名称:图的一些基本相关操作函数

/*
名称:图的一些基本相关操作函数
说明:为了后面图的遍历等高层次一点应用,在这里先敲出一些有待调用基本函数。包括求对应结点的编号,求对应结点的名称、创建树、等等。在这里分别用临接矩阵和临接表实现来了上述操作。

*/

///////////////////////////
//临接矩阵构造的图的相关函数操作
///////////////////////////

//求图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;

}
  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值