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