邻接多重表存储无向图以及有关操作(二)

2014-11-24 03:13:35 · 作者: · 浏览: 16
p)

{

cout<<"顶点"<

while(p)

{

if(p->ivex == i)

{

cout<jvex].data<<" ";

p=p->ilink;

}

else

{

//p->jvex == i

cout<ivex].data<<" ";

p=p->jlink;

}

}

}

else

cout<<"该顶点无相邻顶点"<

}

bool Insert_Arc(string v1,string v2)

{

//插入新边,不插入平行边

if(Search_Arc(v1,v2))

{

cout<<"该边已存在图中,不重复插入"<

return false;

}

int i,j;

i=Locate_Vex(v1);

j=Locate_Vex(v2);

if(i == -1 || j == -1)

{

cout<<"两个顶点中,又不符合要求的,插入失败"<

return false;

}

EBox *p=new EBox;

p->ivex=i;

p->jvex=j;

p->ilink=adjmulist[i].firstedge;

p->jlink=adjmulist[j].firstedge;

adjmulist[i].firstedge=adjmulist[j].firstedge=p;

//记得边数要加1

arcnum++;

return true;

}

bool Delete_Arc(string v1,string v2)

{

//删除顶点v1,v2之间的边

if(Search_Arc(v1,v2))

{

int i,j;

i=Locate_Vex(v1);

j=Locate_Vex(v2);

if(i == -1 || j == -1)

{

cout<<"输入的顶点中,有不在图中的,所以删除失败"<

return false;

}

//四个指针,pre是指向待删除边的前一条边,rear是指向待删除的边

//i,j是代表两个端点

EBox *ipre,*irear,*jpre,*jrear;

//初始化四个指针

ipre=irear=adjmulist[i].firstedge;

jpre=jrear=adjmulist[j].firstedge;

//下面先判断第一条边是不是就是要删除的边

if(ipre->ivex == i && ipre->jvex == j)

{

adjmulist[i].firstedge=ipre->ilink;

adjmulist[j].firstedge=ipre->jlink;

delete ipre;

arcnum--;

return true;

}

else if(ipre->jvex == i && ipre->ivex == j)

{

adjmulist[i].firstedge=ipre->jlink;

adjmulist[j].firstedge=ipre->ilink;

delete ipre;

arcnum--;

return true;

}

else

{

//待删除的边不是第一条

//先让irear指向待删除的那条边

while(irear)

{

if(irear->ivex == i && irear->jvex != j)

{

ipre=irear;

irear=irear->ilink;

}

else if(irear->jvex == i && irear->ivex != j)

{

ipre=irear;

irear=irear->jlink;

}

else if(irear->ivex == i && irear->jvex == j)

break;

else if(irear->jvex == i && irear->ivex == j)

break;

}

if(!irear)

return false;

//下面让jrear指向待删除边

if(irear->ivex == i)

{

//所以irear->jvex == j