//删除两点之间的边
void RemoveEgde(GraphLnk *g,T vertex1,T vertex2)
{
int v1 = GetVertexPos(g,vertex1);
int v2 = GetVertexPos(g,vertex2);
if(v1 == -1 || v2 == -1)
{
return;
}
Edge *q;
Edge *p;
//因为是无向图
//删除v1 -- v2边
p = g->NodeTable[v1].adj;
while(p != NULL && p->dest!=v2)
{
q = p;
p = p->link;
}
if(p == NULL)
{
return;
}
if(q == NULL)
{
g->NodeTable[v1].adj = p->link;
}
else{
q->link = p->link;
}
free(p);
//删除v2 -- v1边
p = g->NodeTable[v2].adj;
while(p->dest != v1)
{
q = p;
p = p->link;
}
if(q == NULL)
{
g->NodeTable[v2].adj = p->link;
}
else
{
q->link = p->link;
}
free(p);
g->NumEdges--;
}
//删除图中的点以及删除与该点相连的边
void RemoveVertex(GraphLnk *g,T vertex)
{
int v = GetVertexPos(g,vertex);
if(v == -1)
{
return;
}
Edge *p = g->NodeTable[v].adj;
Edge *s;
Edge *t = NULL; //s的前驱
int k;
while(p!=NULL)
{
k = p->dest;
s = g->NodeTable[k].adj;
while(s!=NULL&&s->dest!=v) //寻找与删除点相关的边的下标
{
t = s;
s = s->link;
}
if(s!=NULL)
{
if(t==NULL)
{
g->NodeTable[k].adj = s->link;
}
else
{
t->link = s->link;
}
free(s);
}
g->NodeTable[v].adj = p->link;
free(p);
p = g->NodeTable[v].adj;
}
g->NumVertices--;
g->NodeTable[v].data = g->NodeTable[g->NumVertices].data;
g->NodeTable[v].adj = g->NodeTable[g->NumVertices].adj;
s = g->NodeTable[v].adj;
while(s != NULL)
{
k = s->dest;
p = g->NodeTable[k].adj;
while(p!=NULL)
{
if(p->dest == g->NumVertices)
{
p->dest = v;
break;
}
p = p->link;
}
s = s->link;
}
}
//摧毁图结构
void DestroyGraph(GraphLnk *g)
{
Edge *p;
for(int i=0;i<g->NumVertices;++i)
{
p = g->NodeTable[i].adj;
while(p != NULL)
{
g->NodeTable[i].adj = p->link;
free(p);
p = g->NodeTable[i].adj;
}
}
free(g->NodeTable);
g->NodeTable = NULL;
g->NumVertices = g->NumEdges = g->MaxVertices = 0;
}
//获取第一个邻接顶点
int GetFirstNeighbor(GraphLnk *g,T vertex)
{
int v = GetVertexPos(g,vertex);
if(v==-1)
return -1;
Edge *p = g->NodeTable[v].adj;
if(p != NULL)
return p->dest;
return -1;
}
//获取某点的下一个邻接点
int GetNextNerghbor(GraphLnk *g,T vertex1,T vertex2)
{
int v1 = GetVertexPos(g,vertex1);
int v2 = GetVertexPos(g,vertex2);
if(v1 ==-1 || v2 == -1)
{
return -1;
}
Edge *p = g->NodeTable[v1].adj;
while(p != NULL&& p->dest != v2)
{
p = p->link;
}
if(p!=NULL && p->link !=NULL)
return p->link->dest;
return -1;
}