#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; }
有向图十字链表表示及各顶点出入度计算
最新推荐文章于 2022-08-16 15:53:18 发布