(1)建立一个邻接表存储的图;(2)输出图的邻接表;(3)输出各顶点的度(若是有向图,输出各顶点的入度、出度和度);(4)对图进行深度优先、广度优先遍历。
【测试数据】
(1)
输入图的种类:2
输入图的顶点数和边数:5 5
输入各条边:0 1 0 3 1 2 2 3 2 4
(2)
输入图的种类:0
输入图的顶点数和边数:3 4
输入各条边:0 1 0 2 1 0 1 2
#include <iostream>
#include <malloc.h>
#include <queue>
using namespace std;
#define VertexType int
#define MaxVertexNum 20 //最大顶点数
queue<int>Q; //辅助队列
enum GraphType {
DG, UDG}; //DG表示有向图,UDG表示无向图
typedef struct ArcNode //边结点
{
int adjvex; //邻接点的下标
struct ArcNode *nextarc; //后继链指针
} ArcNode;
typedef struct VNode //顶点结点
{
VertexType data; //顶点数据
ArcNode *firstarc; //边链头指针
} VNode, AdjList[MaxVertexNum];
typedef struct
{
AdjList vertices; //邻接表
int vexnum,arcnum; //顶点数和边数
int kind; //图种类标志
} ALGraph;
//建立有向图
void CreateDGGraph(ALGraph &G)
{
// cout<<0<<endl;
int m, n; //边<Vm,Vn>的下标
ArcNode *vm, *vn; //构成边<Vm,Vn>的两个顶点
cout << "请输入顶点数和边数:";
cin >> G.vexnum >> G.arcnum;
//获取顶点信息
for(int i=0; i<G.vexnum; i++)
{
G.vertices[i].data=i;
G.vertices[i].firstarc=NULL;
}
//建立邻接表,采用头插法
for(int i=0; i<G.arcnum; i++)
{
cout << "请输入<Vi,Vj>的下标:";
cin >> m >> n;
vm=(ArcNode*)malloc(sizeof(ArcNode));
vm->adjvex=n;
vm->nextarc=NULL;
if(G.vertices[m].firstarc==NULL)
{
vn=G.vertices[m].firstarc=vm;
}
else
{
vn=vn->nextarc=vm;
}
}
}
//建立无向图
void CreateUDGGraph(ALGraph &G)
{
int m, n;