如何从图表中删除圆弧?

时间:2017-06-10 02:56:13

标签: c++

我的图表有这个结构:

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来删除它,但它并不容易。 有人知道如何删除弧吗?

1 个答案:

答案 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 ++不匹配。考虑使用标准库的容器来处理数据结构。