邻接表顶点的删除(C++)

这里的边是无向边

删除顶点v时,要找到顶点v的邻接顶点w,把w中指向v的边删除掉,再删除边(v,w)。循环这个过程,直到把和顶点v有关的边都删除掉为止。

再接着需要删除顶点v。

不可以直接像数组那样直接把顶点v之后的顶点位置像前移动一位,因为这样其他顶点的位置将会发生变化,顶点边中的顶点位置将会出错。

边和顶点的定义如下:

struct Edge{//边节点的定义  
int dest;//边的另一顶点位置  
E cost;//边上的权值  
Edge<T, E> *link;//下一条边链指针  
Edge(){}//构造函数  
Edge(int num, E weight):dest(num),cost(weight),link(NULL){}//构造函数  
bool operator!=(Edge<T, E>& R)const{  
return (dest!=R.dest)?true:false;  
}  
};  
  
template <class T, class E>  
struct Vertex{//顶点的定义  
T data;//顶点的名字  
Edge<T, E> *adj;//边链表的头指针  
};  
删除函数如下:

//在图中删除一个指定顶点v,v是顶点号。  
template <class T, class E>  
bool Graphlink<T,E>::removeVertex(int v){  
  if(v<0||v>=numVertices||numVertices==1)return false;  
  
  Edge<T,E> *t, *p, *s;  
  int i, k;  
  
  while(NodeTable[v].adj!=NULL){  //将顶点  
  p = NodeTable[v].adj;  
  k = p->dest;  
  s = NodeTable[k].adj;  
  t = NULL;  
  while(s!=NULL&&s->dest!=v){  
      t = s; s = s->link;  
  }  
  
  if(s!=NULL){  
      if(t==NULL){//说明第一条边的另一个顶点就是v  
            NodeTable[k].adj = s->link;  
      }  
      else{  
            t->link = s->link;  
      }  
      delete s;  
  }  
  //以上代码是用来将顶点v的入度删除  
  
  NodeTable[v].adj = p->link;  
  delete p;//删除顶点v的边  
  numEdges--;  
}  
//以上代码将所有涉及到顶点v的边都删除了,接下来要调整表结构  
  
  numVertices--;  
  
  NodeTable[v].data = NodeTable[numVertices].data;  
  p = NodeTable[v].adj = NodeTable[numVertices].adj;  
  
  //把原来顶点numVertices的入度改为顶点v的入度  
  while(p!=NULL){  
      s = NodeTable[p->dest].adj;  
      while(s!=NULL){  
      if(s->dest==numVertices){  
      s->dest = v;  
      break;  
      }  
      else s = s->link;  
      }  
      p = p->link;  
  
  }  
  return true;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值