邻接表

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int num;
    int next=0;
}nodez[100000],noden[100000];
int cnt,vnum,enumm,flag;
void CreateMap()
{
    cout<<"请输入总共点数:";cin>>vnum;
    cnt=vnum;
    cout<<"请输入总边数:";cin>>enumm;
    cout<<"请输入图的类型,0为有向图,1为无向图:";cin>>flag;
    cout<<"请依次输入每条边的两个顶点:"<<endl;
    int v1,v2;
    for(int i=1;i<=vnum;i++) {nodez[i].num=i;noden[i].num=i;}
    if(flag==0)
    {
        for(int i=1;i<=enumm;i++)
        {
            cin>>v1>>v2;
            nodez[++cnt].num=v2;nodez[cnt].next=nodez[v1].next;
            nodez[v1].next=cnt;
            noden[++cnt].num=v1;noden[cnt].next=noden[v2].next;
            noden[v2].next=cnt;
        }
    }
    else
    {
        for(int i=1;i<=enumm;i++)
        {
            cin>>v1>>v2;
            nodez[++cnt].num=v2;nodez[cnt].next=nodez[v1].next;
            nodez[v1].next=cnt;
            nodez[++cnt].num=v1;nodez[cnt].next=nodez[v2].next;
            nodez[v2].next=cnt;
        }
    }
}
void Print()
{
    for(int i=1;i<=vnum;i++)
    {
        int now=i;
        cout<<nodez[now].num;
        now=nodez[now].next;
        while(now)
        {
            cout<<"->";
            cout<<nodez[now].num;
            now=nodez[now].next;
        }
        cout<<endl;
    }
}
bool check()
{
    cout<<"请输入需要判断的边是否存在的两个顶点:";
    int v1,v2;cin>>v1>>v2;
    int now=nodez[v1].next;
    while(now)
    {
        if(nodez[now].num==v2) return 1;
        now=nodez[now].next;
    }
    return 0;
}
void du()
{
    int v;
    cout<<"请输入查询点:";cin>>v;
    if(flag==0)
    {
        int now=nodez[v].next;int tot=0;
        while(now)
        {
            tot++;
            now=nodez[now].next;
        }
        cout<<""<<v<<"个结点的入度为"<<tot<<" ";
        now=noden[v].next;tot=0;
        while(now)
        {
            tot++;
            now=noden[now].next;
        }
        cout<<"出度为"<<tot<<endl;
    }
    else
    {
        int now=nodez[v].next;int tot=0;
        while(now)
        {
            tot++;
            now=nodez[now].next;
        }
        cout<<""<<v<<"个结点的入度和出度均为"<<tot<<endl;
    }
}
void menu()
{
    cout<<"-------------------------"<<endl;
    cout<<"1.判断边是否存在"<<endl;
    cout<<"2.顶点度数"<<endl;
    cout<<"3.退出"<<endl;
    cout<<"-------------------------"<<endl;
}
int main()
{
    CreateMap();
    while(1)
    {
        menu();
        int choice;cin>>choice;
        switch(choice)
        {
            case 1:if(check())cout<<"存在"<<endl;else cout<<"不存在"<<endl;;break;
            case 2:du();break;
            case 3:return 0;
        }
    }
}
posted @ 2019-12-07 20:35  ChildeZhe  阅读(245)  评论(0)    收藏  举报