十字链表

#include<iostream>
using namespace std;
typedef int TElemType;
typedef struct Node
{
    TElemType Data;
    int Tail_Vex;
    int Head_Vex;
    Node * tlink;
    Node * hlink;
};
typedef struct Head_Node
{
    string Name;
    Node * First_In;
    Node * First_Out;
};
typedef struct Graph
{
    int Vex_num, Edge_num;
    Head_Node * arr;
};
int Get_Location(Graph T,string name)
{
    for(int i = 1; i <= T.Vex_num; i++)
    {
        if(T.arr[i].Name == name)
            return i;
    }
    return -1;
}
void Create_Graph(Graph & T)
{
    cin>>T.Vex_num>>T.Edge_num;
    T.arr = new Head_Node[T.Vex_num + 1];
    for(int i = 1; i <= T.Vex_num; i++)
    {
        cin>>T.arr[i].Name;
        T.arr[i].First_In = nullptr;
        T.arr[i].First_Out = nullptr;
    }
    int x, y;string n1, n2;
    for(int i = 1; i <= T.Edge_num; i++)
    {
        cin>>n1>>n2;
        x = Get_Location(T,n1);
        y = Get_Location(T,n2);
        Node * s = new Node;
        s->Tail_Vex = x;s->Head_Vex = y;
        s->tlink = T.arr[x].First_Out;
        T.arr[x].First_Out = s;
        s->hlink = T.arr[y].First_In;
        T.arr[y].First_In = s;
    }
    cout<<"create finish"<<endl;
}
int * Degree(Graph T,string name)
{
    int index = Get_Location(T,name);
    Node * s = T.arr[index].First_In;
    int in_num = 0, out_num = 0;
    while(s != nullptr)
    {
        in_num++;
        s = s->hlink;
    }
    s = T.arr[index].First_Out;
    while(s != nullptr)
    {
        out_num++;
        s = s->tlink;
    }
    int * arr = new int[2];
    arr[0] = in_num;arr[1] = out_num;
    return arr;
}
void Add_Degree(Graph &T, string name1, string name2,int data = 1)
{
    int x = Get_Location(T,name1);
    int y = Get_Location(T,name2);
    Node * s = new Node;
    s->Head_Vex = y;s->Tail_Vex = x;
    s->hlink = T.arr[y].First_In;
    T.arr[y].First_In = s;
    s->tlink = T.arr[x].First_Out;
    T.arr[x].First_Out = s;
    T.Edge_num++;
}
int main()
{
    Graph T;
    int * arr;
    Create_Graph(T);
    cout<<"结点\t"<<"入度\t"<<"出度"<<endl;
    for(int i = 1; i <= T.Vex_num; i++)
    {
        arr = Degree(T,T.arr[i].Name);
        cout<<T.arr[i].Name<<"\t"<<arr[0]<<"\t"<<arr[1]<<endl;
    }
    Add_Degree(T,T.arr[1].Name,T.arr[4].Name);Add_Degree(T,T.arr[2].Name,T.arr[4].Name);
    cout<<"结点\t"<<"入度\t"<<"出度"<<endl;
    for(int i = 1; i <= T.Vex_num; i++)
    {
        arr = Degree(T,T.arr[i].Name);
        cout<<T.arr[i].Name<<"\t"<<arr[0]<<"\t"<<arr[1]<<endl;
    }
}
/*
4 7
v1 v2 v3 v4
v1 v2
v1 v3
v3 v1
v3 v4
v4 v3
v4 v1
v4 v2
*/







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值