创建邻接矩阵和邻接表(C++)

创建图(不考虑权重)的邻接矩阵和邻接表 

(这次是正经的) 

参阅了程杰老师的《大话数据结构》 ,例子来源于清华大学的《计算机软件技术基础》。

一、创建邻接矩阵。

#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;
}

运行结果如下:

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值