创建图(不考虑权重)的邻接矩阵和邻接表
(这次是正经的)
参阅了程杰老师的《大话数据结构》 ,例子来源于清华大学的《计算机软件技术基础》。
一、创建邻接矩阵。
#include <iostream>
using namespace std;
typedef int Vtype; //定义顶点类型
#define MAXVEX 20 //最大顶点个数
//定义图结构
struct MGraph
{
Vtype v[MAXVEX]; //顶点表
int arr[MAXVEX][MAXVEX]; //邻接矩阵
int numV,numE; //图中当前顶点数和边数
};
//建立无向图的邻接矩阵表示
void CreatGraph(MGraph *G)
{
int i,j,k;
cout<<"输入顶点数和边数\n";
cin>>G->numV>>G->numE;
cout<<"输入顶点信息";
for(i = 0;i < G->numV;i++)
cin>>G->v[i];
//邻接矩阵初始化
for(i = 0;i < G->numV;i++)
{
for(j = 0;j < G->numE;j++)
G->arr[i][j] = 0;
}
//创建邻接矩阵
for(k = 0;k < G->numE;k++)
{
cout<<"输入边对应两顶点的下标\n";
cin>>i>>j;
G->arr[i][j] = 1;
G->arr[j][i] = 1;
}
//打印邻接矩阵
cout<<"邻接矩阵为:\n";
for(i=0;i<G->numV;i++)
{
for(j=0;j<G->numV;i++)
cout<<G->arr[i][j]<<" ";
cout<<"\n";
}
}
//建立有向图的邻接矩阵表示
void CreatGraph(MGraph *G)
{
int i,j,k;
cout<<"输入顶点数和弧数\n";
cin>>G->numV>>G->numE;
cout<<"输入顶点信息";
for(i = 0;i < G->numV;i++)
cin>>G->v[i];
//邻接矩阵初始化
for(i = 0;i < G->numV;i++)
{
for(j = 0;j < G->numE;j++)
G->arr[i][j] = 0;
}
//创建邻接矩阵
for(k = 0;k < G->numE;k++)
{
cout<<"输入弧Vi->Vj对应两顶点的下标\n";
cin>>i>>j;
G->arr[i][j] = 1;
}
//打印邻接矩阵
cout<<"邻接矩阵为:\n";
for(i=0;i<G->numV;i++)
{
for(j=0;j<G->numV;i++)
cout<<G->arr[i][j]<<" ";
cout<<"\n";
}
}
二、创建邻接表 。
#include <iostream>
using namespace std;
typedef int Vtype; //定义顶点类型
#define MAXVEX 20 //最大顶点个数
//边表结点
struct EdgeNode
{
Vtype adjvex; //邻接点的下标
EdgeNode *next; //指向下一个邻接点
};
//顶点表结点
struct VertexNode
{
Vtype data; //顶点信息
EdgeNode *firstedge; //边表的头指针
};
struct GraphList
{
VertexNode adjlist[MAXVEX];
int numV,numE; //图中当前顶点数和边数
};
//创建无向图的邻接表
void CreateAL(GraphList *GL)
{
int i,j,k;
EdgeNode *p;
cout<<"输入顶点数和边数\n";
cin>>GL->numV>>GL->numE;
//建立顶点表
cout<<"输入顶点信息";
for(i = 0;i < GL->numV;i++)
{
cin>>GL->adjlist[i].data;
GL->adjlist[i].firstedge = NULL;
}
//建立边表
for(k = 0;k < GL->numE;k++)
{
cout<<"输入边的两顶点的下标";
cin>>i>>j;
p = new EdgeNode;
p->adjvex = j;
p->next = GL->adjlist[i].firstedge;
GL->adjlist[i].firstedge = p;
p = new EdgeNode;
p->adjvex = i;
p->next = GL->adjlist[j].firstedge;
GL->adjlist[j].firstedge = p;
}
//打印邻接表
cout<<"邻接表为:\n";
for(i=0;i<GL->numV;i++)
{
p=GL->adjlist[i].firstedge;
cout<<GL->adjlist[i].data;
while(p)
{
cout<<"->"<<GL->adjlist[p->adjvex].data;
p=p->next;
}
printf("\n");
}
}
//创建有向图的邻接表
void CreateAL(GraphList *GL)
{
int i,j,k;
EdgeNode *p;
cout<<"输入顶点数和弧数\n";
cin>>GL->numV>>GL->numE;
//建立顶点表
cout<<"输入顶点信息";
for(i = 0;i < GL->numV;i++)
{
cin>>GL->adjlist[i].data;
GL->adjlist[i].firstedge = NULL;
}
//建立边表
for(k = 0;k < GL->numE;k++)
{
cout<<"输入弧Vi->Vj对应两顶点的下标\n";
cin>>i>>j;
p = new EdgeNode;
p->adjvex = j;
p->next = GL->adjlist[i].firstedge;
GL->adjlist[i].firstedge = p;
}
//打印邻接表
cout<<"邻接表为:\n";
for(i=0;i<GL->numV;i++)
{
p=GL->adjlist[i].firstedge;
cout<<GL->adjlist[i].data;
while(p)
{
cout<<"->"<<GL->adjlist[p->adjvex].data;
p=p->next;
}
cout<<"\n";
}
}
三、例子。(输入一个有向图的信息,同时输出该图的邻接矩阵、邻接表和各顶点的出度入度)
将上面的程序进行了合并,然后进行了一些改动,这样只要输入一次图的信息就可以得到邻接矩阵和邻接表 ,另外加上了求入度出度的程序。
题目如图:(来源于清华大学《计算机软件技术基础》习题2.35)
代码如下:
#include <iostream>
using namespace std;
typedef int Vtype; //定义顶点类型
#define MAXVEX 20 //最大顶点个数
//定义图结构
struct MGraph
{
Vtype v[MAXVEX]; //顶点表
int arr[MAXVEX][MAXVEX]; //邻接矩阵
int numV,numE; //图中当前顶点数和边数
};
//定义边表结点
struct EdgeNode
{
Vtype adjvex; //邻接点的下标
EdgeNode *next; //指向下一个邻接点
};
//定义顶点表结点
struct VertexNode
{
Vtype data; //顶点信息
EdgeNode *firstedge; //边表的头指针
};
struct GraphList
{
VertexNode adjlist[MAXVEX];
int numV,numE; //图中当前顶点数和边数
};
//同时建立有向图的邻接矩阵和邻接表,并输出各点的入度和出度
void CreatGraph(MGraph *G,GraphList *GL)
{
int i,j,k;
EdgeNode *p;
cout<<"输入顶点数和弧数\n";
cin>>G->numV>>G->numE;
GL->numV = G->numV;
GL->numE = G->numE;
cout<<"输入顶点信息\n";
for(i = 0;i < G->numV;i++)
{
cin>>G->v[i];
GL->adjlist[i].data = G->v[i];
GL->adjlist[i].firstedge = NULL;
}
//邻接矩阵初始化
for(i = 0;i < G->numV;i++)
{
for(j = 0;j < G->numV;j++)
G->arr[i][j] = 0;
}
//创建邻接矩阵和邻接表
for(k = 0;k < G->numE;k++)
{
cout<<"输入弧Vi->Vj对应两顶点的下标(注意是下标不是信息!)\n";
cin>>i>>j;
G->arr[i][j] = 1;
p = new EdgeNode;
p->adjvex = j;
p->next = GL->adjlist[i].firstedge;
GL->adjlist[i].firstedge = p;
}
//打印邻接表和邻接矩阵
cout<<"邻接矩阵为:\n";
for(i=0;i<G->numV;i++)
{
for(j=0;j<G->numV;j++)
cout<<G->arr[i][j]<<" ";
cout<<"\n";
}
cout<<"邻接表为:\n";
for(i=0;i<GL->numV;i++)
{
p=GL->adjlist[i].firstedge;
cout<<GL->adjlist[i].data;
while(p)
{
cout<<"->"<<GL->adjlist[p->adjvex].data;
p=p->next;
}
cout<<"\n";
}
//根据邻接矩阵算入度和出度
int id[MAXVEX],od[MAXVEX];
for (i=0;i<G->numV;i++)
{
id[i] = 0;
od[i] = 0;
for (j=0;j<G->numV;j++)
{
id[i] = id[i] + G->arr[i][j];
od[i] = od[i] + G->arr[j][i];
}
cout<<G->v[i]<<"的出度为:"<<id[i]<<",入度为:"<<od[i]<<"\n";
}
}
int main()
{
MGraph *G;
GraphList *GL;
G = new MGraph;
GL = new GraphList;
CreatGraph(G,GL);
system("pause");
return 0;
}
运行结果如下: