设计算法实现:
1.建立有向邻接表
2.求有向图的入度,出度,度
3.输出图(图的遍历)
(注:图的创建时,直接输入字符和定点之间关系)
#include <iostream>
#include <stdio.h>//注意
#include <stdlib.h>//注意
using namespace std;
#define MAX_VERTEX_NUM 20
typedef char VertexType,VexType;
typedef int EdgeType,InfoType;
typedef struct ArcNode{ //边(弧)结点的类型定义
int adjvex; //边(弧)的另一顶点的在数组中的位置
ArcNode *nextarc;//指向下一边(弧)结点的指针
InfoType *info; //该弧相关信息的指针
}ArcNode;
typedef struct Vnode{//顶点结点及其数组的类型定义
VertexType data; //顶点信息
ArcNode * firstarc; //指向关联该顶点的边(弧)链表
} Vnode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices;
int vexnum, arcnum; //图的当前顶点数和弧数
int kind; //图的种类标志
} ALGraph; //图邻接表类型
int LocateVex(ALGraph &G , VexType vp)
{
int k=0 ;
for (k=0 ; k<G.vexnum ; k++)
{if (G. vertices[k].data==vp) return(k) ;}
return(-1) ; /* 图中无此顶点 */
}
void CreatALGraph(ALGraph &G)//有向带权图的创建
{
char e1,e2=0;
int k,l=0,m=0;
ArcNode *s;
cin>>G.vexnum>>G.arcnum; //输入顶点数和边数
for( int i=0;i<G.vexnum;i++)
{ cin>>G.vertices[i].data;//输入顶点信息
G.vertices[i].firstarc=NULL;
}
for(k=0;k<G.arcnum;k++)
{ cin>>e1>>e2;
s=(ArcNode*)malloc(sizeof(ArcNode));
l=LocateVex(G, e1);
m=LocateVex(G , e2);
s->adjvex=m;
s->nextarc=G.vertices[l].firstarc;
G.vertices[l].firstarc=s;
}
}
void OutputALGraph(ALGraph &G)//邻接表的输出
{ int i;
for(i=0;i<G.vexnum;i++)
{ ArcNode * s;
s=G.vertices[i].firstarc;
while(s!=NULL)
{ printf("\t%d",s->adjvex);
s=s->nextarc; }
printf("\n");
}
}
void Degree(ALGraph &G)//入度 出度 度
{ int k,t;
ArcNode *p ;
int indegree[100];
int outdegree[100];
for (k=0; k<G.vexnum; k++)
{ indegree[k]=0 ;/* 顶点入度初始化 */}
for (k=0; k<G.vexnum; k++)
{
outdegree[k]=0;/* 顶点出度初始化 */
p=G.vertices[k].firstarc ;
t=0;
while (p!=NULL) /* 顶点入度统计 */
{ t=p->adjvex;
outdegree[k]++;
//printf("%d",t);
indegree[t]++ ;
p=p->nextarc ; }
}
for(int i=0;i<G.vexnum;i++)
{
cout <<G.vertices[i].data<<" "<<indegree[i]<<" "<<outdegree[i]<<" "<<indegree[i]+outdegree[i]<<endl;
}
}
int main()
{
ALGraph G;
CreatALGraph(G);
//OutputALGraph(G);
Degree(G);
return 0;
}
结果如下: