{
cout<<"顶点"< while(p) { if(p->ivex == i) { cout< p=p->ilink; } else { //p->jvex == i cout< 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