BJFUOJ-277

基于邻接表的顶点的删除

#include <iostream>
using namespace std;
#define maxsize 100
typedef struct ArcNode{
    int val;//指向的顶点名称
    ArcNode* next;
    ArcNode():val(0),next(nullptr){}
    ArcNode(int x):val(x),next(nullptr){}
}ArcNode;
typedef struct VexNode{
    int data;//顶点信息
    ArcNode* first; //指向的第一条边
    VexNode():data(0),first(nullptr){}
}VexNode;

typedef struct {
    VexNode vexs[100];
    int VexNum;
    int ArcNum;
}AlGraph;

void InitGraph(AlGraph &G,int n,int m){
    G.VexNum = n;
}
//构建无向图
void CreateGraph(AlGraph &G,int n,int m){
    InitGraph(G,n,m);
    for(int i = 1;i<=n;i++){//创造顶点
        G.vexs[i].data = i; //赋值名称
    }
    for(int i = 1;i<=m;i++){ //创建边
        int n1,n2;
        cin>>n1>>n2;
        ArcNode* arc = new ArcNode(n2);
        arc->next = G.vexs[n1].first;
        G.vexs[n1].first = arc;


        ArcNode * arc1 = new ArcNode (n1);
        arc1->next = G.vexs[n2].first;
        G.vexs[n2].first = arc1;
    }


}
void print(AlGraph G){

    for(int i = 1;i<=G.VexNum;i++){
        if(G.vexs[i].data !=0 ){
            cout<<G.vexs[i].data;
            ArcNode * p = G.vexs[i].first;
            while(p){
                cout<<" "<<p->val;
                p = p->next;
            }
            cout<<endl;
        }

    }
}
void del_node(AlGraph &G,int n){
    //删除边
    for(int i = 1;i<=G.VexNum;i++){
        ArcNode * p = G.vexs[i].first;
        ArcNode* pre = p;
        while(p){
            if(p == G.vexs[i].first && p->val == n){//删除第一个结点
                G.vexs[i].first = p->next;
                delete p;
                break;
            }
            if(p->val == n){ //删除其他结点
                pre->next = p->next;
                delete p;
                break;
            }
            pre = p;
            p = p->next;
        }

    }

    //删除顶点
    int index = 0;
    for(int i = 1;i<=G.VexNum;i++){ //找到data为n的顶点
        if(G.vexs[i].data == n){
            index = i;
            break;
        }
    }

//
//    print(G);

    for(int i = index;i<=G.VexNum-1;i++){
        G.vexs[i].data  = G.vexs[i+1].data;
        G.vexs[i].first = G.vexs[i+1].first;

    }
    G.VexNum--;
}

int main(){

    int n,m;
    while(cin>>n>>m && (n!=0 && m!=0)){
        AlGraph G;
        CreateGraph(G,n,m);
        int del_n;
        cin>>del_n;
        del_node(G,del_n);
        print(G);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值