0
点赞
收藏
分享

微信扫一扫

数据结构——图(邻接表创建无向网,有向网)

十日十月Freddie 2022-02-08 阅读 45

邻接矩阵和邻接表的区别

1.结点结构定义

//边结点定义
typedef struct ArcNode{
	int index;//改变所指向顶点的位置 
	int num;//边的权值
	struct ArcNode*nextArc; //指向下一条边的指针 
}ArcNode; 
//顶点结构
typedef struct vNode{
	Elemtype data;
	ArcNode*firstArc;
}VNode,Alist[MAX_SIZE]; 


//图的结构定义
typedef struct{
	Alist Datas;//相当于一个结构体数组 
	int VexNum;//顶点数 
	int ArcNum;//弧边数 
}Graph; 

2.确定顶点对应的数组下标

//确定顶点对应的数组下标
int LocateVex(Graph G,Elemtype t)
{
	for(int i=0;i<G.VexNum;i++)
	{
		if(t==G.Datas[i].data)
		{
			return i;
		}
	}
	return -1;
}

3.采用邻接表表示法创建无向网

//采用邻接表表示法创建无向网 
void CreatGraph(Graph &G)
{
	cout<<"请依次输入顶点数和总边数:"<<endl;
	cin>>G.VexNum>>G.ArcNum;
	cout<<"输入各顶点的数据:"<<endl; 
	for(int i=0;i<G.VexNum;i++) 
	{
		cin>>G.Datas[i].data;
		G.Datas[i].firstArc=NULL;//初始化表头结点的指针域 
	}
	cout<<"输入两个顶点并构造链接:"<<endl ;
	for(int k=0;k<G.ArcNum;k++)
	{
		Elemtype v1,v2;
		cin>>v1>>v2;
		int i=LocateVex(G,v1); 
		int j=LocateVex(G,v2);
		//第一次头插法。入度边 
		ArcNode *p1=new ArcNode;
		p1->index=j;
		p1->nextArc=G.Datas[i].firstArc;//头插法 
		G.Datas[i].firstArc=p1;
		//无向表两个顶点各用一次头插法 
		//第二次头插法。出度边 
		ArcNode* p2=new ArcNode;
		p2->index=i;
		p2->nextArc=G.Datas[j].firstArc;//头插法 
		G.Datas[j].firstArc=p2;
	 } 
 } 

4.创建无向表

/*邻接表
特点:(1)邻接表不唯一。(2)若无向图中有n个顶点,e条边,
适宜存储稀疏图,则其邻接表需n个头结点和2e个表结点 */
#include<iostream>
using namespace std;
#define MAX_SIZE 100//最大顶点数 
typedef char Elemtype;
//边结点定义
typedef struct ArcNode{
	int index;//改变所指向顶点的位置 
	int num;//边的权值
	struct ArcNode*nextArc; //指向下一条边的指针 
}ArcNode; 
//顶点结构
typedef struct vNode{
	Elemtype data;
	ArcNode*firstArc;
}VNode,Alist[MAX_SIZE]; 


//图的结构定义
typedef struct{
	Alist Datas;//相当于一个结构体数组 
	int VexNum;//顶点数 
	int ArcNum;//弧边数 
}Graph; 
//确定定点对应的数组下标
int LocateVex(Graph G,Elemtype t)
{
	for(int i=0;i<G.VexNum;i++)
	{
		if(t==G.Datas[i].data)
		{
			return i;
		}
	}
	return -1;
}

//采用邻接表表示法创建无向网 
void CreatGraph(Graph &G)
{
	cout<<"请依次输入顶点数和总边数:"<<endl;
	cin>>G.VexNum>>G.ArcNum;
	cout<<"输入各顶点的数据:"<<endl; 
	for(int i=0;i<G.VexNum;i++) 
	{
		cin>>G.Datas[i].data;
		G.Datas[i].firstArc=NULL;//初始化表头结点的指针域 
	}
	cout<<"输入两个顶点并构造链接:"<<endl ;
	for(int k=0;k<G.ArcNum;k++)
	{
		Elemtype v1,v2;
		cin>>v1>>v2;
		int i=LocateVex(G,v1); 
		int j=LocateVex(G,v2);
		//第一次头插法。入度边 
		ArcNode *p1=new ArcNode;
		p1->index=j;
		p1->nextArc=G.Datas[i].firstArc;//头插法 
		G.Datas[i].firstArc=p1;
		//无向表两个顶点各用一次头插法 
		//第二次头插法。出度边 
		ArcNode* p2=new ArcNode;
		p2->index=i;
		p2->nextArc=G.Datas[j].firstArc;//头插法 
		G.Datas[j].firstArc=p2;
	 } 
 } 
int main()
{
	Graph G;
	CreatGraph(G);
 } 

5.创建有向表(出度)

/*邻接表
特点:(1)邻接表不唯一。(2)若无向图中有n个顶点,e条边,
适宜存储稀疏图,则其邻接表需n个头结点和2e个表结点 */
#include<iostream>
using namespace std;
#define MAX_SIZE 100//最大顶点数 
typedef char Elemtype;
//边结点定义
typedef struct ArcNode{
	int index;//改变所指向顶点的位置 
	int num;//边的权值
	struct ArcNode*nextArc; //指向下一条边的指针 
}ArcNode; 
//顶点结构
typedef struct vNode{
	Elemtype data;
	ArcNode*firstArc;
}VNode,Alist[MAX_SIZE]; 


//图的结构定义
typedef struct{
	Alist Datas;//相当于一个结构体数组 
	int VexNum;//顶点数 
	int ArcNum;//弧边数 
}Graph; 
//确定定点对应的数组下标
int LocateVex(Graph G,Elemtype t)
{
	for(int i=0;i<G.VexNum;i++)
	{
		if(t==G.Datas[i].data)
		{
			return i;
		}
	}
	return -1;
}

//采用邻接表表示法创建无向网 
void CreatGraph(Graph &G)
{
	cout<<"请依次输入顶点数和总边数:"<<endl;
	cin>>G.VexNum>>G.ArcNum;
	cout<<"输入各顶点的数据:"<<endl; 
	for(int i=0;i<G.VexNum;i++) 
	{
		cin>>G.Datas[i].data;
		G.Datas[i].firstArc=NULL;//初始化表头结点的指针域 
	}
	cout<<"输入两个顶点并构造链接:"<<endl ;
	for(int k=0;k<G.ArcNum;k++)
	{
		Elemtype v1,v2;
		cin>>v1>>v2;
		int i=LocateVex(G,v1); 
		int j=LocateVex(G,v2);
		//第一次头插法。出度边 
		ArcNode *p1=new ArcNode;
		p1->index=j;
		p1->nextArc=G.Datas[i].firstArc;//头插法 
		G.Datas[i].firstArc=p1;
	 } 
 } 
int main()
{
	Graph G;
	CreatGraph(G);
 } 

6.创建有向表(入度)

/*邻接表
特点:(1)邻接表不唯一。(2)若无向图中有n个顶点,e条边,
适宜存储稀疏图,则其邻接表需n个头结点和2e个表结点 */
#include<iostream>
using namespace std;
#define MAX_SIZE 100//最大顶点数 
typedef char Elemtype;
//边结点定义
typedef struct ArcNode{
	int index;//改变所指向顶点的位置 
	int num;//边的权值
	struct ArcNode*nextArc; //指向下一条边的指针 
}ArcNode; 
//顶点结构
typedef struct vNode{
	Elemtype data;
	ArcNode*firstArc;
}VNode,Alist[MAX_SIZE]; 


//图的结构定义
typedef struct{
	Alist Datas;//相当于一个结构体数组 
	int VexNum;//顶点数 
	int ArcNum;//弧边数 
}Graph; 
//确定定点对应的数组下标
int LocateVex(Graph G,Elemtype t)
{
	for(int i=0;i<G.VexNum;i++)
	{
		if(t==G.Datas[i].data)
		{
			return i;
		}
	}
	return -1;
}

//采用邻接表表示法创建无向网 
void CreatGraph(Graph &G)
{
	cout<<"请依次输入顶点数和总边数:"<<endl;
	cin>>G.VexNum>>G.ArcNum;
	cout<<"输入各顶点的数据:"<<endl; 
	for(int i=0;i<G.VexNum;i++) 
	{
		cin>>G.Datas[i].data;
		G.Datas[i].firstArc=NULL;//初始化表头结点的指针域 
	}
	cout<<"输入两个顶点并构造链接:"<<endl ;
	for(int k=0;k<G.ArcNum;k++)
	{
		Elemtype v1,v2;
		cin>>v1>>v2;
		int i=LocateVex(G,v1); 
		int j=LocateVex(G,v2);
		第二次头插法。入度边 
		ArcNode* p2=new ArcNode;
		p2->index=i;
		p2->nextArc=G.Datas[j].firstArc;//头插法 
		G.Datas[j].firstArc=p2;
	 } 
 } 
int main()
{
	Graph G;
	CreatGraph(G);
 } 
举报

相关推荐

0 条评论