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

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

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

map 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; inext;
            delete p;
            p = q;
        }
        //删除其它顶点中与之相关的边
        for(int i=0; iname)==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< 
 

你可能感兴趣的:(C/C++)