邻接表中删除一个顶点和与之相关的边

在邻接表中,删除一个顶点需要先删除其在顶点数组中的存储,再删除在其他结点中与被删除节点相关的边,具体代码如下:

/*
 * 邻接表的定义
 * 采取头结点数组+边表节点链表的结构
 */

map<string,int> mmp;//映射字符串和坐标之间的关系

struct ArcNode//边表节点
{
    string name;
    int wigth;
    ArcNode* next;
};

struct VertexNode//顶点表节点
{
    string name;//名字
    ArcNode* firstarc;//指向边表节点的第一个元素
};

class Graph
{
private:
    int pointnum,eagenum;
    VertexNode point[maxn];//顶点数组
    ArcNode* last[maxn];//指向尾节点
    int vis[maxn];//标记数组
    int dis[maxn];//距离数组
    void insertElement(int pos, ArcNode * p);
    void sortlist(VertexNode nil);
public:
    Graph();//构造函数
    void create(int pointnum,int eagenum);
    void initvis();
    void get_agree();//输出度
    void dfs(string begin,int flag);//深度优先搜索
    void bfs(string begin);//广度优先搜索
    void dfs_all(string begin);
    void sort();
    void bfs_all(string begin);
    int get_connected_num();//求连通分量
    bool is_connected();//是否连通
    bool is_exit(string str);//一点是否存在
    void delete_point(string str);
    void Dijkstra(string begin);
    void Prim();
    void Kruskal();
    //TODO:最小生成树,
    void print();
};
void Graph::delete_point(string str)
{
    if(pointnum==0)
    {
        printf("don't have the graph\n");
        return;
    }
    if(is_exit(str))
    {
        int position = -1; //表示删除顶点在顶点数组中的位置
        ArcNode *p, *q, *r;
        p = point[mmp[str]].firstarc;
        for(int i=mmp[str]+1; i<pointnum; i++)
        {//遍历顶点数组,并删除顶点数组中的被删顶点
            point[i-1].name = point[i].name;
            point[i-1].firstarc = point[i].firstarc;
            mmp[point[i-1].name]=i-1;
        }
        pointnum--;
        //删除被删顶点连接的边信息
        while(p)
        {
            q = p->next;
            delete p;
            p = q;
        }
        //删除其它顶点中与之相关的边
        for(int i=0; i<pointnum; i++)
        {
            p = point[i].firstarc;
            while(p)
            {
                if(str.compare(p->name)==0)
                {
                    if(p==point[i].firstarc)
                    {
                        point[i].firstarc=p->next;
                    }
                    else
                    {
                        r->next=p->next;
                    }
                    q=p;
                    p=p->next;
                    delete q;
                }
                else
                {
                    r=p;
                    p=p->next;
                }
            }
        }
        cout<<str<<" have deleted"<<endl;
        //删除完点和边以后对图做dfs和bfs操作
        //初始化vis
        cout<<"dfs:"<<endl;
        initvis();
        for(int i=0;i<pointnum;i++)
        {
            if(!vis[i])
                dfs(point[i].name,1);
        }
    }
    else
        printf("the point does noy exit\n");
}
posted @ 2019-03-20 15:41  zju_cxl  阅读(737)  评论(0编辑  收藏  举报