#include<iostream>
#define MAX_VERTEX_NUM 50
using namespace std;
//定义顶点信息数据类型
typedef char VertexData;
//定义图的种类
typedef enum{DG,UDG} GraphKind;
//定义弧结点
typedef struct ArcNode
{
int tailvex,headvex; //定义弧结点的弧头,弧尾在图中的位置
ArcNode *tlink,*hlink;
}ArcNode;
//定义顶点
typedef struct VertexNode
{
VertexData data;
ArcNode *firstin,*firstout;
}VertexNode;
//定义有向图的十字链表
typedef struct OrthList
{
VertexNode Vertex[MAX_VERTEX_NUM];
int vertexNum,arcNum; //定义顶点数,弧数
GraphKind kind;
}OrthList;
void CreateOrthList(OrthList *orthList)
{
ArcNode *q=NULL;
int s,d; //定义弧结点的起始,目的位置
cout<<"输入有向图的顶点数(vNum),边数(eNum)\n";
cin>>orthList->vertexNum>>orthList->arcNum;
orthList->kind=DG;
//初始化十字链表顶点信息
for(int i=1;i<=orthList->vertexNum;i++)
{
cout<<"输入第"<<i<<"个顶点的信息\n";
cin>>orthList->Vertex[i].data;
orthList->Vertex[i].firstin=NULL;
orthList->Vertex[i].firstout=NULL;
}
for(i=1;i<=orthList->arcNum;i++)
{
q=(ArcNode *)malloc(sizeof(ArcNode));
cout<<"输入第"<<i<<"条边的起始(s)目的位置(d)\n";
cin>>s>>d;
q->tailvex=s;q->headvex=d;
q->tlink=orthList->Vertex[s].firstout;
orthList->Vertex[s].firstout=q;
q->hlink=orthList->Vertex[d].firstin;
orthList->Vertex[d].firstin=q;
}
}
//求每个顶点的出度与入度
void GetDegree(OrthList *orthList)
{
ArcNode *q=NULL;
int outDegree,inDegree;
for(int i=1;i<=orthList->vertexNum;i++)
{
outDegree=0;inDegree=0;
//计算顶点Vertex[i]的出度
q=orthList->Vertex[i].firstout;
while(q!=NULL)
{
outDegree++;
q=q->tlink;
}
// //计算顶点Vertex[i]的入度
q=orthList->Vertex[i].firstin;
while(q!=NULL)
{
inDegree++;
q=q->hlink;
}
cout<<"顶点"<<orthList->Vertex[i].data<<"的出度为"<<outDegree<<endl;
cout<<"顶点"<<orthList->Vertex[i].data<<"的入度为"<<inDegree<<endl<<endl;
}
}
int main()
{
OrthList *orthList=(OrthList *)malloc(sizeof(OrthList));
CreateOrthList(orthList);
GetDegree(orthList);
return 0;
}
有向图十字链表表示及各顶点出入度计算
最新推荐文章于 2021-08-27 02:12:23 发布
本文介绍了一种使用十字链表表示有向图的方法,并提供了创建图及计算顶点出入度的C++实现。通过实例展示了如何初始化图结构、添加边及计算各顶点的出入度。
2307





