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