頂点およびエッジに関連付けられたネイバーテーブルを削除

隣接テーブルで、頂点を削除し、削除する必要があるが、次のように削除ノード側に関連する他のノード、特定のコードを削除し、頂点配列に記憶されている:

/ * 
 *隣接テーブル定義
 *テイク結節点+グループ連結リストノード構造のエッジリスト
 * / 

地図<文字列、整数> MMP;文字列との座標間//マッピング

構造体ArcNode //エッジリストノード
{ 
    文字列名; 
    int型wigth; 
    ArcNode *次; 
}; 

構造体VertexNode //頂点ノードリスト
{ 
    文字列名; //名前
    ArcNode * firstarc; //テーブルのエッジノードの最初の要素を指す
}; 

クラスグラフ
{ 
プライベート:
    int型pointnum、eagenum; 
    VertexNodeポイント[MAXN]; //頂点配列
    ArcNode [MAXN] *最後に、テール・ノードへ//ポイント
    のint VIS [MAXN]; //タグ配列
    intが[MAXN] DIS;から//配列 
    ボイドinsertElement(int型のPOS、ArcNode *の P)。
    sortlistが、ボイド(VertexNodeはnil); 
公共:
    グラフ(); //コンストラクタ
    ボイド(pointnum int型、int型eagenum)を作成し、
    無効initvis(); 
    無効get_agree();の//出力
    空DFS(文字列は、int型のフラグを始めます ) ; //深さ優先探索
    のボイドBFS(文字列が始まる); // BFSの
    ボイドdfs_all(文字列開始); 
    空の並べ替え(); 
    無効bfs_all(文字列開始); 
    int型get_connected_num(); //は、接続されているコンポーネントが見つける
    (is_connected BOOL ); //もし通信
    ブールis_exit(文字列str); //少しがある場合
    無効delete_point(文字列STR)は、
    ダイクストラ(文字列の開始)を無効; 
    プリム()を無効; 
    クラスカルを無効(); 
    // TODO:最小スパニングツリー、
    プリントのボイド(); 
};
グラフ:: delete_pointボイド(文字列STR)
{ 
    IF(pointnum == 0)
    { 
        のprintf( "ザ・グラフは、N- \していない持っている"); 
        リターン; 
    } 
    (is_exit(STR))IF 
    { 
        int型の位置= -1; / /頂点配列内の頂点の削除位置を表す
        ArcNode * P、* Q * R&LT; 
        P =ポイント[MMP [STR] firstarc ;. 
        ため(INT I = MMP [STR] +1し、I <pointnum; I ++は)
        {//反復頂点配列、および削除された頂点アレイ削除
            ポイント[-I 1] .nameのポイント= [I] .nameのと、
            ポイント[-I 1] = .firstarcポイント[I] .firstarc; 
            MMP [点[。-I 1] .nameの] = -I 1; 
        } 
        pointnum--; 
        //削除された頂点を削除すると、サイド情報を接続されている
        一方、(P) 
        {
            = P-Q>次に、
            削除P; 
            P = Qであり; 
        } 
        //他のエッジに関連付けられた頂点の削除
        のために(INT I = 0;私は<pointnum; Iは++)
        { 
            P =ポイント[I] .firstarc; 
            一方(P)
            { 
                IF(str.compare(P->名)== 0)
                { 
                    (P ==ポイント[I] .firstarc)IF 
                    { 
                        ポイント[I]は、P-.firstarcを=>次に; 
                    } 
                    { 
                        R- > = P-次>次に; 
                    }  
                    Q = P。
                    P = P->次に、
                    Qは削除; 
                } 
                そうでなければ
                { 
                    R&LT = P; 
                    P = P->次に; 
                } 
            } 
        } 
        COUT STRは<< << << ENDL "を削除しました"; 
        //エンドノードを削除し、DFSとBFSに図の動作を行った後
        / /初期化VIS 
        COUT << "DFSは、" << ENDL; 
        initvis()は、
        のために(INT I = 0; I <pointnum; Iは++)
        { 
            IF(VIS [I]!)
                DFS(ポイント[I] .nameの,. 1 ); 
        } 
    } 
        のprintf( "ポイントが行うノイ出口\ N-"); 
}

おすすめ

転載: blog.csdn.net/hrbust_cxl/article/details/88690555