在邻接表中,删除一个顶点需要先删除其在顶点数组中的存储,再删除在其他结点中与被删除节点相关的边,具体代码如下: /* * 邻接表的定义 * 采取头结点数组+边表节点链表的结构 */ 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"); }