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