我的图表有这个结构:
struct vertex{
string nameV;
string type;
int serial;
string core;
string user;
struct vertex *sigV;
struct arc *subListArcs;
vertex(string n,string t, int s, string c,string u){
nameV=n;
type=t;
serial=s;
core=c;
user=u;
sigV=NULL;
subListArcs=NULL;
}
bool visited;
}*graph;
struct arc{
int megabyte;
string destination;
struct arc *sigA;
arco(int m, string d){
megabyte=m;
destination=d;
sigA=NULL;
};
};
和这个函数在每个向量中找到sublistArcs中的弧:
void deleteArc(string origin, string destination){
struct vertex *tempV=graph;
while(tempV!=NULL){
if(tempV->nameV == origin){
struct arc *tempA=tempV->subListArcs;
while(tempA!=NULL){
if(tempA->destination==destination){
tempA=NULL;
return;
}
tempA=tempA->sigA;
}
tempV=tempV->sigV;
}
}
}
我的想法是使用tempA = NULL来删除它,但它并不容易。 有人知道如何删除弧吗?
答案 0 :(得分:0)
由于您的弧列表是单链接,您不仅需要找到要删除的目标弧,还需要找到列表中的前一个弧,因为当您删除目标时,您需要链接在下一个之前。
struct arc *tempA = tempV->subListArcs;
struct arc *prevA = NULL; // <------- will track previous arc
while(tempA != NULL){
if(tempA->destination==destination){
// caught
if(prevA == NULL){ // arc to remove is first in list
tempV->subListArcs = tempA->sigA; // next becomes first in list
} else {
prevA->sigA = tempA->sigA; // <--- link previous to next
}
// now delete the arc removed from list, and return
delete tempA;
return;
}
prevA = tempA; // <-- keep track of the previous
tempA=tempA->sigA;
}
P.S。这种使用原始指针和链表的代码风格非常C风格,它与现代C ++不匹配。考虑使用标准库的容器来处理数据结构。