数据结构复习代码——图的邻接表的基本操作的实现(续)

1、图的邻接表的基本操作的实现

 

//删除两点之间的边
void RemoveEgde(GraphLnk *g,T vertex1,T vertex2)
{
    int v1 = GetVertexPos(g,vertex1);
    int v2 = GetVertexPos(g,vertex2);
    if(v1 == -1 || v2 == -1)
    {
        return;
    }
    Edge *q;
    Edge *p;
    //因为是无向图
    //删除v1 -- v2边
    p = g->NodeTable[v1].adj;
    while(p != NULL && p->dest!=v2)
    {
        q = p;
        p = p->link;
    }
    if(p == NULL)
    {
        return;
    }
    if(q == NULL)
    {
        g->NodeTable[v1].adj = p->link;
    }
    else{
        q->link = p->link;
    }
    free(p);

    //删除v2 -- v1边
    p = g->NodeTable[v2].adj;
    while(p->dest != v1)
    {
        q = p;
        p = p->link;
    }
    if(q == NULL)
    {
        g->NodeTable[v2].adj = p->link;
    }
    else
    {
        q->link = p->link;
    }
    free(p);
    g->NumEdges--;
}
//删除图中的点以及删除与该点相连的边
void RemoveVertex(GraphLnk *g,T vertex)
{
    int v = GetVertexPos(g,vertex);
    if(v == -1)
    {
        return;
    }
    Edge *p = g->NodeTable[v].adj;
    Edge *s;
    Edge *t = NULL;                 //s的前驱
    int k;
    while(p!=NULL)
    {
        k = p->dest;
        s = g->NodeTable[k].adj;
        while(s!=NULL&&s->dest!=v)          //寻找与删除点相关的边的下标
        {
            t = s;
            s = s->link;
        }
        if(s!=NULL)
        {
            if(t==NULL)
            {
                g->NodeTable[k].adj = s->link;
            }
            else
            {
                t->link = s->link;
            }
            free(s);
        }
        g->NodeTable[v].adj = p->link;
        free(p);
        p = g->NodeTable[v].adj;
    }
    g->NumVertices--;
    g->NodeTable[v].data = g->NodeTable[g->NumVertices].data;
    g->NodeTable[v].adj = g->NodeTable[g->NumVertices].adj;

    s = g->NodeTable[v].adj;
    while(s != NULL)
    {
        k = s->dest;
        p = g->NodeTable[k].adj;
        while(p!=NULL)
        {
            if(p->dest == g->NumVertices)
            {
                p->dest = v;
                break;
            }
            p = p->link;
        }
        s = s->link;
    }

}
//摧毁图结构
void DestroyGraph(GraphLnk *g)
{
    Edge *p;
    for(int i=0;i<g->NumVertices;++i)
    {
        p = g->NodeTable[i].adj;
        while(p != NULL)
        {
            g->NodeTable[i].adj = p->link;
            free(p);
            p = g->NodeTable[i].adj;
        }
    }
    free(g->NodeTable);
    g->NodeTable = NULL;
    g->NumVertices = g->NumEdges = g->MaxVertices = 0;
}
//获取第一个邻接顶点
int GetFirstNeighbor(GraphLnk *g,T vertex)
{
    int v = GetVertexPos(g,vertex);
    if(v==-1)
        return -1;
    Edge *p = g->NodeTable[v].adj;
    if(p != NULL)
        return p->dest;
    return -1;
}
//获取某点的下一个邻接点
int GetNextNerghbor(GraphLnk *g,T vertex1,T vertex2)
{
    int v1 = GetVertexPos(g,vertex1);
    int v2 = GetVertexPos(g,vertex2);
    if(v1 ==-1 || v2 == -1)
    {
        return -1;
    }
    Edge *p = g->NodeTable[v1].adj;
    while(p != NULL&& p->dest != v2)
    {
        p = p->link;
    }
    if(p!=NULL && p->link !=NULL)
        return p->link->dest;
    return -1;
}
图邻接表(续)

 

2、非连通图的遍历(与1部分代码通用图的定义部分,具体的图的节点和连线自行插入)

//以深度优先遍历方式 ----遍历非连通图
void Components(GraphLnk *g)
{
    int n = g->NumVertices;
    int i;
    bool *visited = (bool*)malloc(sizeof(bool)*n);
    assert(visited!=NULL);
    for(i=0;i<n;i++)
    {
        visited[i] = false;
    }
    for(i=0;i<n;++i)
    {
        if(!visited[i])
        {
            DFS(g,i,visited);
            //printf("Nul.\n");
        }

    }
    free(visited);
}

 

posted @ 2022-07-20 15:13  往心。  阅读(44)  评论(0编辑  收藏  举报